使用strcpy分配动态缓冲区数据时遇到问题(SIGSEGV(QT Linux))
char ** data = new char *[10];
int current = 0;
char temp[20];
std::cin >> temp;
strcpy( data[ current++ ], temp); //works(before edit)
//I saw SIGSEGV message only on dynamic input
//that's why I was thinking it works
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
strcpy( data[ current++ ], dynamicTemp ); //SIGSEGV
我应该如何正确存储数据? 它仅适用于知识,因此不需要字符串示例。
答案 0 :(得分:2)
您实际上没有为导致未定义行为的data[current]
中的指针分配内存(UB的可能结果之一是有时它似乎工作正常。)
分配内存并将其分配给指针,或使用std::string
代替(这是我的推荐)。
在现代C ++中,现在几乎没有理由使用指针,尤其是字符串。使用指针只会产生类似于你拥有的问题等等。使用std::string
也意味着如果用户输入的字符串超过19个字符,您将不会有缓冲区溢出的风险。
答案 1 :(得分:0)
您正在取消引用指向未分配内存的指针。
char ** data = new char *[10];
strcpy( data[ current++ ], temp); //works
data[ current++ ]
指向未分配的内存。
代码的另一个问题是不受控制的strcpy
和cin读取。您无法保证用户输入适合您的缓冲区。
答案 2 :(得分:0)
您已分配了一系列char指针。您需要为每个字符串分配内存,如下所示:
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
data[ current++ ] = new char [ 20 ];
strcpy( data[ current ], dynamicTemp );