【发布时间】:2014-06-21 19:24:00
【问题描述】:
我正在尝试设置一个字符串数组(在 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);
}
提前致谢!
【问题讨论】:
-
如果它需要容纳11个字符串,为什么要指定“10”?
-
1)
calloc不会“锁定”任何东西。 2)在进程退出之前释放内存是没有意义的。 3)你的数据被覆盖的原因是你用错误的参数调用fgets。 -
“当这个 fgets() 部分被调用时,我的 Answers 数组的最后一个元素被输入的值覆盖” - 你应该做的是找出为什么会被覆盖并修复它,因为它几乎可以肯定是代码中的错误导致未定义的行为。
-
为什么
calloc只有一个参数? -
“当这个 fgets() 部分被调用时,我的 Answers 数组的最后一个元素被覆盖了”——实际上并没有;但是您正在阅读数组的末尾。您的数组有 10 行,因此当您尝试读取第 11 行时,您碰巧读取了数组之后位于内存中的内容。您现有的
Answers定义没有问题。
标签: c arrays free calloc atexit