Kat*_*arn 1 c arrays free atexit calloc
我正在尝试设置一个字符串数组(在C中,使用Linux).该数组将包含11个字符串(静态长度).我最初将阵列设置为:
char Answers[10][100];
Run Code Online (Sandbox Code Playgroud)
但在我的代码中,我有一个调用fgets(input,sizeof(input),stdin)的部分.当调用这个fgets()部分时,我的Answers数组的最后一个元素被输入的值覆盖(关于答案在堆栈上的位置?).所以现在我试图"锁定"我用于我的Answers数组的内存.我会用吗?
char Answers=calloc(11*sizeof(char));
Run Code Online (Sandbox Code Playgroud)
要么
通过循环运行 -
char Answers[10];
for(c=0;c<=10;c++)
{
Answers[c]=calloc(1*sizeof(char);
}
Run Code Online (Sandbox Code Playgroud)
另外,当我完成时,我需要使用atexit()来释放分配的内存...因为我无法在atexit()中传递参数,所以最好的方法是什么?
atexit(Free);
void Free()
{
free(Answers);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
好吧,我猜很多误会.大多数代码都不正确.你问了11个字符串,所以char Answers[10][100];不正确,你应该输入char Answers[11][100];,这就是它跳过输入的原因.关于错误......首先 - calloc()有两个参数,而不是一个,如malloc()下面的签名:
void *calloc(size_t nmemb, size_t size);
Run Code Online (Sandbox Code Playgroud)
将a返回void*到分配的内存区域,第一个参数是您要分配的元素数,第二个是每个元素的大小.其次,如上面所示,它返回一个POINTER,一个void,因此你无法正确执行这段代码:
char Answers[10];
for(c=0;c<=10;c++)
{
Answers[c] = calloc(11*sizeof(char));
}
Run Code Online (Sandbox Code Playgroud)
有什么问题 ?首先,参数如上所述.但其次是你根据需要制作了一系列字符而不是CHAR POINTERS.应该这样:
char* Answers[11]; //As you requested 11 elements
for(c=0;c<=10;c++)
{
Answers[c] = (char*) calloc(1, MY_STR_LENGTH);
}
Run Code Online (Sandbox Code Playgroud)
当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.
}
Run Code Online (Sandbox Code Playgroud)
就是这样,希望你理解.在此处阅读有关C中内存分配的更多信息
关于malloc()
关于calloc()
关于realloc()