我正在尝试设置一个字符串数组(在C中,使用Linux)。该数组将包含11个字符串(静态长度)。我最初将阵列设置为:
char Answers[10][100];
但在我的代码中,我有一个调用fgets(input,sizeof(input),stdin)的部分。当调用这个fgets()部分时,我的Answers数组的最后一个元素被输入的值覆盖(关于Answers'堆栈上的位置?)。所以现在我试图锁定"我用于Answers数组的内存。我会用
吗?char Answers=calloc(11*sizeof(char));
OR
通过循环运行 -
char Answers[10];
for(c=0;c<=10;c++)
{
Answers[c]=calloc(1*sizeof(char);
}
另外,当我完成时,我需要使用atexit()释放分配的内存...这是最好的方法,因为我无法在内部传递参数atexit对()?
atexit(Free);
void Free()
{
free(Answers);
}
提前致谢!
答案 0 :(得分:5)
好吧,我猜很多误会。大多数代码都不正确。
您要求输入11个字符串,因此char Answers[10][100];
不正确,您应该输入char Answers[11][100];
,这就是它跳过输入的原因。
关于错误......
首先 - calloc()
有两个参数而不是一个,如malloc()
,如下面的签名:
void *calloc(size_t nmemb, size_t size);
将void*
返回到分配的内存区域,第一个参数是您要分配的元素数,第二个是每个元素的大小。
其次,如上面所示,它返回一个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指针上使用了cast,我们更正了calloc
的使用和char指针的声明。现在这段代码是正确的 - 为什么你使用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中内存分配的更多信息: