你好,堆栈交换社区,
我有一个函数,它将CSV文件读入gsl_矩阵,然后返回指向该矩阵的指针该函数无错误执行,但是程序在函数返回后以常数字符串执行PrtTf时退出SIGABRT。我试过:
更改打印的字符串
将字符串抽象为后跟字符的格式
两者都不起作用,但是我发现在调用函数之前放置printf()可以防止这个错误(在下面的main()中注释掉)我在Ubuntu 16.04上用gcc 5.4.0编译在这个行之前调用MalLoCuxStor()表明我正在使用大约6KB的堆。下面显示的LLDB输出准确地说明了哪一行导致print_matrix()中的错误。

Process 10955 stopped
* thread #1: tid = 10955, 0x000000000040114b main`print_matrix(matrix=0x0000000000604010) + 21 at main.c:88, name = 'main', stop reason = step over
    frame #0: 0x000000000040114b main`print_matrix(matrix=0x0000000000604010) + 21 at main.c:88
   85   static void print_matrix(gsl_matrix * matrix)
   86   {
   87     for (int i = 0; i < matrix->size1; i++) {
-> 88       printf("[");
   89       for (int j = 0; j < matrix->size2; j++) {
   90         printf("%g, ", gsl_matrix_get(matrix, i, j));
   91       }
(lldb)
Process 10955 stopped
* thread #1: tid = 10955, 0x00007ffff708d428 libc.so.6`__GI_raise(sig=6) + 56 at raise.c:54, name = 'main', stop reason = signal SIGABRT
    frame #0: 0x00007ffff708d428 libc.so.6`__GI_raise(sig=6) + 56 at raise.c:54

下面显示的代码是main.c中的main函数:
int main(int argc, char * argv[]) {
  /* printf("This is the fix.\n"); */
  gsl_matrix * matrix2 = read_tuples_csv("data/12AX7-Data.csv", 3);
  print_matrix(matrix2);
}

下面的代码是函数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;
  }
}

最佳答案

问题可能是由于:

printf("%g, ", gsl_matrix_get(matrix, i, j));

因为您试图打印一个double,但是您的函数返回一个gsl_矩阵指针。
此外,它被认为是更好的形式printf("%s", "[")printf("%c", '[')而不是printf("[")。

关于c - 带有const char *的printf中的奇怪SIGABRT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46059046/

10-12 16:13
查看更多