使用calloc()设置char数组,完成后也"释放"数组

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)

提前致谢!

Zac*_*h P 5

好吧,我猜很多误会.大多数代码都不正确.你问了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()