【发布时间】:2013-04-10 14:38:51
【问题描述】:
我的代码中出现了段错误,我不知道为什么。我通读一个文件并计算行数,以便动态分配我的数组。然后我倒带文件,读取文件中的数据,将数据存储到变量中,然后将读取的变量存储到数组中,但是我遇到了字符问题。
...
char *aname = malloc(sizeof(char) * 3);
...
// get # lines in file (count)
...
char *aname_seen = malloc(count * (sizeof(char) * 3));
...
rewind(file);
while (fgets(buff, sizeof buff, file) != NULL)
{
if (sscanf(buff, "%s %d %s %s %d %lf %lf %lf %lf %lf\n",
atm, &serial, aname, resName, &resSeq, &x, &y, &z,
&occupancy, &tempFactor) == 10)
{
aname_seen[i] = *aname;
printf("%d: %s vs %s\n", i, aname, aname_seen[i]);
i++;
} // end sscanf if-loop
} // end while loop
我可以使用printf("%d: %s\n", i, aname) 打印名称并获得预期的输出,但是当我尝试printf("%d: %s vs %s\n", i, aname, aname_seen[i]) 时却得到Segmentation fault (core dumped)。
这个 while 循环 + 嵌套 if 循环与我用来计算行数的约定相同,因此i 将递增到计数。我是否错误地分配了 aname_seen 而实际上没有给它 count 数量的 char*3 元素?我不太擅长弄乱char。更多的是数字 fortran 爱好者,所以我需要一些指导。
提前致谢!
【问题讨论】:
-
建议通过
sscanf()指定分配给字符串的最大字符数来防止潜在的缓冲区溢出。这可以通过将"%s"格式说明符替换为"%Ns"来完成,其中N比正在填充的数组中的字符数少一。 -
您似乎没有初始化
i。刚刚被忽略了吗? -
你知道
aname_seen[i] = *aname;只复制一个字符吗? -
@interjay,我现在意识到了这一点。我询问了如何在可修改的左值的答案上解决这个问题。如果您有解决方案,将不胜感激!
-
@Chowlett,它已经被初始化了,只是没有显示在这个sn-p中。
标签: c char segmentation-fault