什么';当scanf(fscanf)遇到EOF时,参数变量中存储的值是多少?

什么';当scanf(fscanf)遇到EOF时,参数变量中存储的值是多少?,c,eof,scanf,C,Eof,Scanf,假设有足够的内存分配给ptr, 当函数遇到EOF时,*ptr中存储的值表示什么? 我尝试在VisualStudio中使用调试工具,发现*ptr的值是-33686019 这是垃圾值吗?或EOF?当scanf点击EOF时,在ptr指向的地址处不存储任何值。 同样,如果它返回0。这就是为什么迭代输入的规范方法必须检查scanf返回值的原因,例如 int *ptr = malloc~ while (fscanf(fp, "%d", ptr++) != EOF) ; 未初始化的值,即垃圾值。此外

假设有足够的内存分配给ptr, 当函数遇到EOF时,*ptr中存储的值表示什么? 我尝试在VisualStudio中使用调试工具,发现*ptr的值是-33686019
这是垃圾值吗?或EOF?

当scanf点击EOF时,
ptr
指向的地址处不存储任何值。 同样,如果它返回0。这就是为什么迭代输入的规范方法必须检查scanf返回值的原因,例如

int *ptr = malloc~
while (fscanf(fp, "%d", ptr++) != EOF)
    ;

未初始化的值,即垃圾值。此外,还需要保存第一个地址。未指定。只有在分配第一个输入参数之前发生错误时,才会返回EOF。例如,如果文件中的第一个字符不是数字,那么为什么要存储任何内容?如果得到
EOF
(或零!),则不能假定存储了有效值。顺便说一下,当使用
ptr++
作为参数时,请记住,您丢失了原始指针。执行
ptr++
后,您不能再调用
free
passing
ptr
,最终存储数据的位置将丢失。请注意,如果输入中有非数字、非空白字符(例如字母),则循环将失控。您应该始终根据有效值的预期数量来调节循环:
while(fscanf(fp,“%d”,ptr++)=1&&ptr
(其中
end
是最初分配的
ptr
值加上分配的
int
数)。您还需要保留
ptr
的值,以便以后使用-如果没有其他内容,则为
free()
if (fscanf(fp, "%d", &ptr_to_int) == 1) {
  /* successful conversion */
}
else {
  /* Unsuccesful conversion or EOF; use feof() to test which. */
}