【发布时间】:2017-03-27 06:49:21
【问题描述】:
int *ptr = malloc~
while (fscanf(fp, "%d", ptr++) != EOF)
;
假设有足够的内存分配给 ptr, 当函数遇到 EOF 时,存储在 *ptr 中的值表示什么? 我尝试在 Visual Studio 中使用调试工具,发现 *ptr 的值为 -33686019 这是垃圾值吗?还是EOF?
【问题讨论】:
-
未初始化值,即垃圾值。另外,需要保存第一个地址。
-
未指定。仅当在分配 第一个输入参数之前发生错误时才返回 EOF。
-
例如,如果文件中的第一个字符不是数字,那么为什么
scanf(or its siblings) 会存储任何东西?如果您得到EOF(或零!),那么您根本无法假设存储了有效值。 -
顺便说一句,当您使用
ptr++作为参数时,请记住您丢失了原始指针。在你做ptr++之后你不能再通过ptr调用free,最终数据存储的位置就丢失了。 -
请注意,如果输入中有非数字、非空白字符(例如字母),那么您的循环将失控崩溃。您应该始终以预期的有效值数量为循环条件:
while (fscanf(fp, "%d", ptr++) == 1 && ptr < end) ;(其中end是最初分配的值ptr加上分配的int的数量)。您还需要保留ptr的值以供以后使用——如果没有别的,则用于free()。