我正在完成这项任务并遇到了问题。有一次,我必须要求用户输入两个输入命令,我希望它们放在一个char数组中。然后我想将它们的输入放入char *但我最终得到了分段错误
以下是我的代码的一小部分,显示我遇到问题的地方:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char firstAns[80];
char * command1[5];
int ansLen;
//Ask for command
cout << "Please enter your first command(incl. args) or quit: ";
cin >> firstAns;
ansLen = strlen(firstAns);
for(int i=0; i < ansLen; i++){
strcpy(command1[i], firstAns);
}
我运行的程序编译得很好,但是我已经将分段错误缩小到程序的这一部分,并且可以使用一些帮助作为新手程序员:)
答案 0 :(得分:4)
你有一个名为char *的char *数组。但是你没有为数组中的指针分配任何内存,甚至没有将它们设置为null。所以它们是随机值,指向随机存储位置。然后,Strcpy会覆盖这些随机位置,从而导致seg故障。您需要首先在所有5行上按command[i]=new char[80]
为这些指针分配内存。
答案 1 :(得分:0)
char * command1[5];
这是一个char*
的数组。然而,它是未初始化的 - 值可以是任何值,因此它们指向内存中随机,无意义的位置。
然后您在command1[i]
中使用未初始化的strcpy(command1[i], firstAns);
。从本质上讲,你所做的是在内存中随机放置并尝试将firstAns复制到它。难怪你的程序崩溃了!
在使用指针之前,必须将其初始化为某个值。如果您需要在内存中存储,请使用malloc()
返回正确大小的存储(sizeof(datatype)*length
+1,如果它是一个字符串)并记住free()
当您返回时从它返回的指针完成它。
了解详情:http://www.cplusplus.com/reference/cstdlib/malloc/
(Gabe Sechan的解决方案也有效.new和malloc是分配内存的C ++和C方式)
答案 2 :(得分:0)
其他问题在这里:
ansLen = strlen(firstAns);
for(int i=0; i < ansLen; i++){
strcpy(command1[i], firstAns);
}
ansLen
是firstAns
的长度,有可能长于5.在这种情况下,
如果您尝试访问command1[i]
,您将访问超出界限的内存,从而导致段错误。
与此同时,正如Patashu和Gabe所指出的那样,你正在使用酉command1
。