首页 > 解决方案 > C中的疯狂错误,未定义的行为?

问题描述

我正在开发一个大型的 C 代码,自然会在一开始就崩溃。我找到了错误的起源,它来自这里:

printf("%s %d", "\nki2 : ", ki2);
puts("\nline # 1704");
printf("%s %d", "\nki2 : ", ki2);

在终端返回:

ki2 :  237
line # 1704

然后以 -1 的退出值崩溃。在第一次访问ki2和第二次访问之间没有发生任何事情,那么为什么程序在第二次调用ki2而不是在第一次调用时崩溃了?!

顺便说一句,这些行是循环执行的,并且在崩溃发生之前成功执行了很多次。

如果将打印行替换为 ,则 Is 的作用相同printf("\nki2 : %i", ki2);

ki2 是一个整数。Is 的值来自存储在动态数组中的另一个 int。

标签: cundefined-behavior

解决方案


也许最后一行卡在输出缓冲区中。尝试

printf("%s %d", "\nki2 : ", ki2);
puts("\nline # 1704");
printf("%s %d", "\nki2 : ", ki2);
fflush(stdout);

*程序更常见的是用 '\n' 终止行而不是用它开始行。你也可以试试

printf("%s %d\n", "ki2 : ", ki2);
puts("line # 1704"); // puts adds '\n' automatically
printf("%s %d\n", "ki2 : ", ki2);

推荐阅读