2

我正在尝试设置一个字符串数组(在 C 中,使用 Linux)。该数组将包含 11 个字符串(静态长度)。我最初将数组设置为:

char Answers[10][100];

但在我的代码中,我有一部分调用 fgets(input,sizeof(input),stdin)。当这个 fgets() 部分被调用时,我的 Answers 数组的最后一个元素被输入的值覆盖(关于 Answers 在堆栈上的位置?)。所以现在我正试图“锁定”我用于 Answers 数组的内存。我会用

char Answers=calloc(11*sizeof(char));

或者

循环运行它——

char Answers[10];
for(c=0;c<=10;c++)
{
    Answers[c]=calloc(1*sizeof(char);
}

另外,完成后我需要使用 atexit() 来释放分配的内存......因为我无法在 atexit() 中传递参数,所以最好的方法是什么?

atexit(Free);

void Free()
{
    free(Answers);
}

提前致谢!

4

1 回答 1

6

好吧,我猜有很多误解。那里的大多数代码都是不正确的。您要求输入 11 个字符串,因此char Answers[10][100];不正确,您应该输入char Answers[11][100];,这就是它跳过输入的原因。关于错误...首先 -calloc()有两个参数,而不是一个,如malloc(),如以下签名中所示:

void *calloc(size_t nmemb, size_t size);

返回 avoid*分配的内存区域,第一个参数是您要分配的元素数量,第二个参数是每个元素的大小。其次,如上所述,它返回一个 POINTER,一个 void 指针,因此您无法正确执行这段代码:

char Answers[10];
for(c=0;c<=10;c++)
{
    Answers[c] = calloc(11*sizeof(char));
}

有什么问题 ?首先,参数,如前所述。但第二个事实是您根据需要制作了一个字符数组而不是 CHAR POINTERS。应该是这样的:

char* Answers[11]; //As you requested 11 elements
for(c=0;c<=10;c++)
{
    Answers[c] = (char*) calloc(1, MY_STR_LENGTH);
}

当 MY_STR_LENGTH 是常数 100 时,如您的示例所示。我们在 void 指针上使用了强制转换,我们更正了callocchar 指针的使用和声明。现在这段代码是正确的——还有,你为什么要使用calloc?通常不需要在字符串中这样做。顺便说一句,无论如何,当它是一条线时就不需要函数。第二种声明方式是这样的:

char **Answers = calloc(11, sizeof(char*));
for(i = 0 ; i < 11 ; i++)
{
   Answers[i] = calloc(1, sizeof(char)*MY_STRING_LENGTH); //Basically it is MY_STRING_LENGTH as sizeof(char) is almost always one, but it's there only for the readability of the code.
}

就是这样,希望你能理解。在此处阅读有关 C 中内存分配的更多信息:

关于malloc() 关于calloc() 关于realloc()

于 2014-06-21T21:05:04.817 回答