vfscanf.c没有这样的文件或目录

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) {

从一本书中学习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;
}
#包括
#包括
内部主(空)
{
双*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)