如何在动态char*缓冲区上使用strcpy



使用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读取。您不能保证用户输入适合您的缓冲区。

最新更新