我正在按照本教程(纯 c++)在 Objective-c 和 C 中制作 .obj 加载器。但我注意到,fscanf()
即使您不向它发送要设置的变量的内存地址(仅发送值),该函数对我来说运行良好。对此有解释吗?
Vec2 *uv;
fscanf(file, "%f %f\n", uv.x, uv.y);
[tempUVs addObject:uv];
请注意,参数 uv.x 和 uv.y 没有与号。
我正在按照本教程(纯 c++)在 Objective-c 和 C 中制作 .obj 加载器。但我注意到,fscanf()
即使您不向它发送要设置的变量的内存地址(仅发送值),该函数对我来说运行良好。对此有解释吗?
Vec2 *uv;
fscanf(file, "%f %f\n", uv.x, uv.y);
[tempUVs addObject:uv];
请注意,参数 uv.x 和 uv.y 没有与号。
当你这样做时,这是未定义的行为。任何事情都可能发生——它可能会崩溃,它可能碰巧正确运行,它可能看起来正确运行,同时默默地破坏内存,或者它可能会擦除你的硬盘驱动器。根据语言标准,这些都是允许的行为。
如果你用一个不错的编译器编译,你可以提高你的警告级别(例如-Wall
,可能还-Wextra -pedantic
使用 GCC 或 Clang),当你将错误的参数传递给*scanf
/*printf
系列函数时,它会警告你。具体来说,该-Wformat
选项会针对此类事情发出警告(-Wformat
作为 的一部分包含在内-Wall
)。