vfscanf.c没有这样的文件或目录
从一本书中学习malloc(),我在书中尝试了一个例子。以下是exmaple的代码vfscanf.c没有这样的文件或目录,c,C,从一本书中学习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) {
#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;
}
#包括
#包括
内部主(空)
{
双*ptd;
int max;
整数;
int i=0;
puts(“您将输入多少个双精度值?”);
如果(扫描频率(“%d”,&max)!=1)
{
puts(“输入不正确”);
退出(退出失败);
}
ptd=(双*)malloc(最大*尺寸(双));
如果(ptd=NULL)
{
puts(“分配内存失败”);
退出(退出失败);
}
puts(“输入值(q以退出)”;
而(i代码中的错误在这里:
if (ptd=NULL)
您不是在测试前面对malloc
的调用是否成功,而是将ptd
设置为NULL
,这会在您尝试取消引用指针时导致崩溃。您的书有错误或您在复制代码时出错-这一行当然应该是:
if (ptd == NULL)
注意:如果启用了编译器警告(例如,gcc-Wall…
)然后编译器会向您指出这一点,并为您省去了很多痛苦。始终启用编译器警告,并始终注意它们。这只是意味着gdb无法从C标准库中找到相关的源文件。由于该错误最有可能出现在您自己的代码中,因此您可能不需要逐步执行标准库源代码,因此您可以忽略此警告。继续查看堆栈,直到找到您的源代码。现在显然是在scanf()的格式说明符之前留出一个空格的好时机
,以消除缓冲区中的任何空白。请回答您的问题,并展示引发问题的输入示例。非常感谢!现在我记住您的建议。但是“ptd=NULL”是如何导致错误的?它们之间似乎没有任何关系。您需要了解=
和之间的区别=
=
是赋值,=
是比较。在使用malloc
分配ptd
后,您立即将其设置为NULL
,而不是将其与NULL
进行比较。当然,我知道=不是比较。我想知道的是ptd=NULL
如何导致vfscanf.c错误。我已经解释了如果您已经将ptd
设置为NULL
,您认为接下来会发生什么?现在ptd
是指向分配内存的有效指针吗?当您尝试在ptd+i
存储值时,调用scanf
会发生什么?
if (ptd == NULL)