我在Objective-c和C中创建一个.obj加载器,遵循这个tutorial(纯c ++)。但是我注意到函数fscanf()
对我运行正常,即使你没有发送它要设置的变量的内存地址(仅发送值)。对此有解释吗?
Vec2 *uv;
fscanf(file, "%f %f\n", uv.x, uv.y);
[tempUVs addObject:uv];
请注意,参数uv.x和uv.y没有符号。
答案 0 :(得分:6)
当你这样做时,未定义的行为。任何事情都可能发生 - 它可能会崩溃,它可能会正常运行,它可以显示以正确运行而无声地破坏内存,或者它可能会擦除您的硬盘驱动器。根据语言标准,这些都是允许的行为。
如果你正在使用一个不错的编译器进行编译,你可以使用GCC或Clang提高你的警告级别(例如-Wall
,也可能-Wextra -pedantic
),并且它可以警告你将错误的参数传递给*scanf
/ *printf
系列函数。具体来说,-Wformat
选项会针对此类事件发出警告(-Wformat
包含在-Wall
中)。