C printf中带有常量字符的奇怪SIGABRT*
你好,Stack Exchange社区 我有一个函数,它将CSV文件读入gsl_矩阵,然后返回指向该矩阵的指针。函数执行时没有错误,但是在函数返回后,当使用常量字符串执行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()表明我使用
- 更改打印的字符串
- 将字符串抽象为后跟字符的格式
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("[");