从书中学习malloc(),我在书上试了一个例子。以下是exmaple的代码。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double * ptd;
int max;
int number;
int i=0;
puts("how many double values will you enter?");
if (scanf("%d",&max)!=1)
{
puts("Input not proper.");
exit(EXIT_FAILURE);
}
ptd=(double *) malloc(max*sizeof(double));
if (ptd=NULL)
{
puts("Failed to assign memory.");
exit(EXIT_FAILURE);
}
puts("Enter values(q to exit)");
while (i<max && scanf("%lf", ptd+i)==1) i++;
printf("The following %d numbers are what you entered:\n",number=i);
for (i=0; i<number; i++)
{
printf("%7.2f ",ptd[i]);
if (i%7==6) putchar('\n');
}
if (i%7!=0) putchar('\n');
free(ptd);
puts("Bye!");
return 0;
}
然后我用gcc编译了这个并运行它。起初它似乎工作正常,但是当我输入双值(第23,24行)时,第26行的消息没有出来。所以我通过gdb调试它,我遇到了一个错误:
vfscanf.c:没有这样的文件或目录。
编辑以下是输入并导致gdb。
how many double values wil you enter?
5
Enter values(q to exit)
1.2 2.3 3.4 4.5 5.6
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a6a4cf in _IO_vfscanf_internal (s=<optimized out>,
format=<optimized out>, argptr=argptr@entry=0x7fffffffe0a8,
errp=errp@entry=0x0) at vfscanf.c:2444
2444 vfscanf.c: No such file or directory.
The possible duplicate in the question似乎无法解决我的问题。
错误意味着什么,我该如何解决?
答案 0 :(得分:1)
您的代码中存在错误:
if (ptd=NULL)
而不是测试前一次调用malloc
是否成功,而是将ptd
设置为NULL
,然后在尝试取消引用指针时导致崩溃。你的书有错误或者在复制代码时犯了错误 - 这一行当然应该是:
if (ptd == NULL)
注意:如果您启用了编译器警告(例如gcc -Wall ...
),那么编译器会向您指出这一点,并为您节省了很多悲伤。始终启用编译器警告,并始终关注它们。