【发布时间】:2015-08-04 21:35:40
【问题描述】:
我知道有人问过类似的问题,但似乎都没有解决我的问题。当我运行我的代码时,我得到了Segmentation fault (core dumped)。
“data.dat”中的第一行包含文件中的点总数,下一行包含点坐标(二维)。我使用fgets 读取第一行,然后使用fscanf 读取下一行。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int n = atoi(argv[1]);
FILE *fp;
fp = fopen("data.dat","r");
if (fp == NULL) {
perror("Error");
}
int number;
char str[3];
fgets(str, 3, fp);
number = atoi(str); // number of points to read from the file
printf("number of lines: %d\n", number);
// defining matrix to hold points
float *P = (float *) malloc(sizeof(float)*2*number);
int i = 0;
while(i < number){
int ret = fscanf(fp, "%f%f", P[i*number + 1], P[i*number + 2]);
printf("%f %f", P[i*number + 1], P[i*number + 2]);
if (ret == 2){
i++;
}
}
fclose(fp);
return 0;
}
编译它不会给我任何错误,但它确实给了我以下警告:
polynom.c: In function ‘main’:
polynom.c:32:24: warning: format ‘%f’ expects argument of type ‘float*’,but argument 3 has type ‘double’ [-Wformat=]
int ret = fscanf(fp, "%f%f", P[i*number + 1], P[i*number + 2]);
^
polynom.c:32:24: warning: format ‘%f’ expects argument of type ‘float *’, but argument 4 has type ‘double’ [-Wformat=]
我并没有真正理解,因为我确实将参数 3 定义为浮点数。
我使用命令行变量运行代码,所以分段错误不是因为这个。
【问题讨论】:
-
如果您正在扫描三位数字,您会遇到一个非常大的问题,因为您的字符数组正好是 3 个字节长。您必须允许空终止,否则您的 atoi 将超出界限。
-
请发布一些示例输入数据并尝试对其进行描述。
-
代码将
float传递给fscanf()。fscanf()不需要知道float的值,它需要知道存储结果的float的地址。使用fscanf(fp, "%f%f", &P[i*number + 1] ...(添加&)注意:还有很多其他问题 -
编译时,始终启用所有警告。然后修复警告。毕竟,编译器比我们人类更了解 C 语言,而且人类容易犯错。建议阅读 fscanf() 的手册页,它会告诉你(除其他外)变量必须是指针。
-
建议使用调试器,例如“gdb”来单步执行代码以确定哪一行导致了段错误事件。然后,您可以检查该行(和正在进行的事件)以确定 seg 故障事件的原因。
标签: c segmentation-fault coordinates scanf