C printf中带有常量字符的奇怪SIGABRT*

C printf中带有常量字符的奇怪SIGABRT*,c,io,sigabrt,C,Io,Sigabrt,你好,Stack Exchange社区 我有一个函数,它将CSV文件读入gsl_矩阵,然后返回指向该矩阵的指针。函数执行时没有错误,但是在函数返回后,当使用常量字符串执行printf时,程序将使用SIGABRT退出。我试过: 更改打印的字符串 将字符串抽象为后跟字符的格式 两者都不起作用,但是我发现在调用函数之前放置printf()可以防止此错误(在下面的main()中注释掉)。我在Ubuntu 16.04上使用gcc 5.4.0进行编译。在此行之前调用malloc_stats()表明我使用

你好,Stack Exchange社区

我有一个函数,它将CSV文件读入gsl_矩阵,然后返回指向该矩阵的指针。函数执行时没有错误,但是在函数返回后,当使用常量字符串执行printf时,程序将使用SIGABRT退出。我试过:

  • 更改打印的字符串
  • 将字符串抽象为后跟字符的格式
两者都不起作用,但是我发现在调用函数之前放置printf()可以防止此错误(在下面的main()中注释掉)。我在Ubuntu 16.04上使用gcc 5.4.0进行编译。在此行之前调用malloc_stats()表明我使用了大约6kB的堆。下面显示的LLDB输出准确地说明了导致print_matrix()中错误的行

下面的代码是函数read_tuples_csv(),它位于util.c中。该函数获取要读取的文件的路径和要解析的元组的大小。我怀疑问题出在这个函数中,但到目前为止,没有任何校对或调试能够揭示我的语义中的错误

gsl_matrix * read_tuples_csv(const char * filename, size_t n)
{
  FILE * file;
  if ((file = fopen(filename, "r")) == NULL || n <= 0)
    return NULL;

  List * list = malloc(sizeof(List));
  list_init(list, free);

  double * arr;
  while (!feof(file)) {
    arr = calloc(n, sizeof(double));
    char *line = NULL, *scratch;
    size_t n = 0;
    if (getline(&line, &n, file) == -1) goto error_exit;
    line = strtok_r(line, ",", &scratch);

    int i = 0;
    do {
      int ret = sscanf(line, "%lf", &arr[i]);
      if (ret <= 0) fprintf(stderr, "Something happened:\nline:\t%s", line);
      i++;
    } while ((line = strtok_r(NULL, ",", &scratch)) != NULL && i < n);

    free(line);
    line = NULL;
    if (list_insnxt(list, list_tail(list), arr) != 0)
      goto error_exit;
  }
  fclose(file);
  file = NULL;

  gsl_matrix * matrix = gsl_matrix_alloc(list_size(list), n);
  int i = 0;
  while (list_size(list) > 0) {
    double * vector;
    list_remnxt(list, NULL, (void **)&vector);
    for (int j = 0; j < n; j++) {
      gsl_matrix_set(matrix, i, j, vector[j]);
    }
    i++;
  }

  list_dest(list);
  free(list);

  return matrix;

 error_exit: {
    if (file != NULL) fclose(file);
    list_dest(list);
    free(arr);
    free(list);
    return NULL;
  }
}
gsl\u矩阵*读取元组\u csv(常量字符*文件名,大小\u t n)
{
文件*文件;

如果((file=fopen(filename,“r”))==NULL | | n则问题可能是由于:

printf("%g, ", gsl_matrix_get(matrix, i, j));
因为您试图打印一个double,但是您的函数返回一个gsl_矩阵指针


还有一种更好的形式是
printf(“%s”)、“[”
printf(“%c”)、“[”)
,而不是
printf(“[”
)。

多亏@SouravGhosh和@PaulOgilvie提供了答案。问题在于我使用feof()作为while循环的开关。这是一种糟糕的做法,在很多情况下(包括这一种情况)它导致了未定义的行为。为什么这会导致

printf("[");

失败是我无法理解的。这似乎是stdout的缓冲区溢出,但我通过调用fflush()进行了测试在失败前的stdout上,问题没有得到解决。如果有人能够确定问题的确切原因,我将不胜感激。还要感谢@SouravGhosh提醒我忘记检查calloc()的返回值。

我没有看到检查
malloc()的任何错误
和家庭!!寻求调试帮助的问题(为什么此代码不起作用?)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅:如何创建问题。@SouravGhosh感谢您捕捉到这些问题。我正在立即修复这些问题,但问题仍然存在另外,请告诉我如何完善我的问题。我试图提供一个最小的示例,以及对问题的最大描述。如果有帮助的话,我可以将函数的输出包含在printf“fix”中。另外,它被认为是
printf(“%s”)、“[”
printf(“%c”、“[”)的更好形式
而不是
printf(“[”)
。由谁编写?
printf("%g, ", gsl_matrix_get(matrix, i, j));
printf("[");