为什么fscanf在没有使用参数3+的地址的情况下工作正常?

dan*_*pen -1 c objective-c memory-address

我按照本教程(纯c ++)在Objective-c和C中创建.obj加载器.但是我注意到fscanf()即使你没有向它发送它要设置的变量的内存地址(仅发送值),该函数也能正常运行.对此有解释吗?

 Vec2 *uv;
 fscanf(file, "%f %f\n", uv.x, uv.y);
 [tempUVs addObject:uv];
Run Code Online (Sandbox Code Playgroud)

请注意,参数uv.x和uv.y没有符号.

Ada*_*eld 6

当你这样做时,它是未定义的行为.任何事情都可能发生 - 它可能会崩溃,可能会发生正常运行,它可能在静默破坏内存时显示正常运行,或者它可能会擦除您的硬盘驱动器.根据语言标准,这些都是允许的行为.

如果你正在使用一个不错的编译器进行编译,你可以提高你的警告级别(例如-Wall,也可能-Wextra -pedantic使用GCC或Clang),当你将错误的参数传递给*scanf/ *printf函数系列时它会发出警告.具体来说,该-Wformat选项将警告这种事情(-Wformat包括在内-Wall).