C++ 如何在动态字符*缓冲区上使用strcpy
使用strcpy(SIGSEGV(QT-Linux))分配动态缓冲区数据时遇到问题 我应该如何正确地存储数据?C++ 如何在动态字符*缓冲区上使用strcpy,c++,C++,使用strcpy(SIGSEGV(QT-Linux))分配动态缓冲区数据时遇到问题 我应该如何正确地存储数据? 这只是为了获取知识,所以不需要字符串示例。您实际上没有为数据[current]中的指针分配内存,从而导致未定义的行为(UB的一个可能结果是,有时它似乎工作正常) 分配内存并将其分配给指针,或者改用std::string(这是我的建议) 在现代C++中,使用这些指针的原因很小,尤其是字符串。使用指针只会产生像你现在这样的问题,甚至更多。使用std::string还意味着,如果用户输入的
这只是为了获取知识,所以不需要字符串示例。您实际上没有为
数据[current]
中的指针分配内存,从而导致未定义的行为(UB的一个可能结果是,有时它似乎工作正常)
分配内存并将其分配给指针,或者改用std::string
(这是我的建议)
在现代C++中,使用这些指针的原因很小,尤其是字符串。使用指针只会产生像你现在这样的问题,甚至更多。使用
std::string
还意味着,如果用户输入的字符串长度超过19个字符,则不会有缓冲区溢出的风险。您正在取消对未分配内存的指针的引用
char ** data = new char *[10];
strcpy( data[ current++ ], temp); //works
数据[current++]
指向未分配的内存
代码的另一个问题是无法控制的strcpy和cin读取。您无法保证用户输入是否适合缓冲区。您已经分配了字符指针数组。您需要为每个字符串分配内存,如下所示:
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
data[ current++ ] = new char [ 20 ];
strcpy( data[ current ], dynamicTemp );
char**data=new char*[10]代码>为char*
分配了10个指针,但每个指针都指向一个随机位置。因此,即使是strcpy(数据[current++],temp)代码>不工作。@ USE181008:这不是C++吗?代码>新的<代码>只能在C++中使用。你必须使用C数组吗?@ NaNaLover抱歉,我没有看到<代码> STD::CIN < /C>和<代码>新< /Cord>……“//Works”的行实际上不工作,它是未定义的。直到后来才显示任何症状是未定义行为的一个例子。这就是我想要的,只是data[current]=new char[strlen(temp)];strcpy(数据[current++],数据)代码>这是我使用的方式。
char * dynamicTemp = new char [ 20 ];
std::cin >> dynamicTemp;
data[ current++ ] = new char [ 20 ];
strcpy( data[ current ], dynamicTemp );