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

时间:2014-06-21 19:24:00

标签: c arrays free calloc atexit

我正在尝试设置一个字符串数组(在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);
}

提前致谢!

1 个答案:

答案 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中内存分配的更多信息:

About malloc() About calloc() About realloc()