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

时间:2016-01-07 14:15:45

标签: c++

使用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

我应该如何正确存储数据? 它仅适用于知识,因此不需要字符串示例。

3 个答案:

答案 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 );