Basile Stary..
7
你有一些未定义的行为(所以可能发生任意不好的事情,你不应该期待任何好事).随着对的printf函数期望(注意,当作为参数传递一个被晋升为一个),但是是文字型的.此外,不同的编译器(甚至同一编译器的不同版本)或不同的优化标志可能会产生不同的不良影响.%fdoublefloatdouble0int
(对未定义行为的良好态度是努力总是避免它;不要浪费时间去试图理解具体发生的事情;但是将UB视为非常肮脏或" 生病 "的东西,你总是避免)
要解释观察到的行为,您需要深入了解特定实现的细节,特别是ABI和调用约定(对于可变函数àla printf).另外,查看生成的汇编代码(使用GCC,编译gcc -fverbose-asm -S -O1); 有可能在一个不同于一个参数的寄存器(或一些调用堆栈槽)中传递一个double参数int(因此该printf函数正在使垃圾发生在该位置或寄存器中); 另请注意,通常sizeof(int)可能是4但sizeof(double)可能是8(因此数据量甚至不对).
为了避免这种错误,需要有良好的编译器(如编译的习惯GCC或锵/ LLVM在免费软件领域),并启用所有警告和调试信息(例如,编译使用gcc -Wall -Wextra -g与GCC).编译器会警告你.
BTW,void main()是非法的.它至少应该是int main(void)优选的int main(int argc, char**argv),你应该注意这些论点.
在您的示例中,gcc -Wall -Wextra(使用GCC 7)告诉(对于您的源文件april.c):
april.c:4:10: warning: return type of ‘main’ is not ‘int’ [-Wmain]
void main() {
^~~~
april.c: In function ‘main’:
april.c:5:14: warning: