4

我正在处理这个任务并且遇到了一个问题。有一次,我必须要求用户提供两个稍后使用的输入命令,并且我希望将它们放入一个 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);
}

我从中运行的程序编译得很好,但我已将分段错误缩小到程序的这一部分,并且可以作为新手程序员使用一些帮助:)

4

3 回答 3

4

您有一个名为命令的 char* 数组。但是您没有为数组中的指针分配任何内存,甚至没有将它们设置为空。所以它们是随机值,指向随机内存位置。然后,Strcpy 会覆盖这些随机位置,从而导致段错误。您需要command[i]=new char[80]首先在所有 5 行上为这些指针分配内存。

于 2013-04-17T03:54:22.300 回答
0

char * command1[5];

这是一个char*s 数组。但是,它是未初始化的——这些值可以是任何值,因此它们指向内存中随机的、无意义的位置。

然后,您稍后使用未初始化command1[i]的 in strcpy(command1[i], firstAns);。本质上,您所做的只是在内存中随机放置并尝试将 firstAns 复制到其中。难怪你的程序崩溃了!

在使用指针之前,您必须将其初始化为某个值。如果您需要在内存中存储,请使用malloc()返回正确大小的存储空间(sizeof(datatype)*length如果是字符串则为 +1),并free()在完成后记住从它返回的指针。

阅读更多:http ://www.cplusplus.com/reference/cstdlib/malloc/

(Gabe Sechan 的解决方案也有效。new 和 malloc 是 C++ 和 C 分配内存的方式)

于 2013-04-17T03:53:15.413 回答
0

附加问题在这里:

  ansLen = strlen(firstAns);
  for(int i=0; i < ansLen; i++){
     strcpy(command1[i], firstAns);
  }

ansLen是 的长度firstAns,它可能比 5 长。在这种情况下,如果您尝试访问command1[i],您将访问超出范围的内存,导致段错误。

同时,您正在使用command1Patashu 和 Gabe 指出的单元化。

于 2013-04-17T04:01:19.943 回答