使用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
我应该如何正确存储数据?这只是为了知识,所以不需要字符串示例。
您实际上没有为data[current]
中的指针分配内存,导致未定义的行为(UB的一个可能结果是,有时似乎运行良好)。
要么分配内存并将其分配给指针,要么使用std::string
(这是我的建议)。
在现代C++中,现在几乎没有理由使用指针,尤其是字符串。使用指针只会产生类似您所遇到的问题,甚至更多。使用std::string
也意味着,如果用户输入的字符串长度超过19个字符,就不会有缓冲区溢出的风险。
您已经分配了一个char指针数组。您需要为每个字符串分配内存,类似于以下内容:
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
data[ current++ ] = new char [ 20 ];
strcpy( data[ current ], dynamicTemp );
您正在取消引用指向未分配内存的指针。
char ** data = new char *[10];
strcpy( data[ current++ ], temp); //works
data[ current++ ]
指向未分配的内存。
代码的另一个问题是不受控制的strcpy
和cin读取。您不能保证用户输入适合您的缓冲区。