在数组segfault中存储char

时间:2013-04-10 14:38:51

标签: c char segmentation-fault

我的代码中出现了段错误,我不确定原因。我读了一个文件并计算了行数,以便动态分配我的数组。然后我回放文件,读取文件中的数据,将数据存储到变量中,然后将读取的变量存储到数组中,但是我遇到了字符问题。

   ...
   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)打印aname并获得预期的输出,但是当我尝试Segmentation fault (core dumped)时,我得到printf("%d: %s vs %s\n", i, aname, aname_seen[i])

这个while循环+嵌套if循环是我用来计算行数的相同约定,因此i将递增计数。我是否错误地分配了aname_seen并且实际上没有给它countchar*3个元素?我不太擅长搞乱char。更多的数字fortran buff,所以我需要一些方向。

提前致谢!

2 个答案:

答案 0 :(得分:3)

%s格式说明符应该与char *参数对应。在您的情况下,aname_seen[i]char,为了传递到可变参数函数(int),它会被提升为printfint不是char *

也许你的意思是其中之一:

printf("%d: %s vs %c\n", i, aname, aname_seen[i]);
printf("%d: %s vs %s\n", i, aname, &aname_seen[i]);

如果这些都没有解决您的问题,请准确解释您对此表达式的期望,并为我们提供一个最小的,可编译的测试用例。您当前的测试用例不可编译。

答案 1 :(得分:1)

你定义的方式aname_seen是一个指向char数组的指针

char *aname_seen = malloc(count * (sizeof(char) * 3));

所以aname_seen[i]char

所以

printf("%d: %s vs %s\n", i, aname, aname_seen[i]);

应该是

printf("%d: %s vs %c\n", i, aname, aname_seen[i]);