奇怪:printf()影响variables值

这是一段代码:

int somefunc() { /* ... */ while ((pos = KMP_index(array, size, pattern, plen)) > -1) { count++; } return count; } 

somefunc()在多个subprocess中调用,每个fork有一个调用。

我的代码编译和Linux x86_64和i386上的预期工作。 但是当我在Atom上网本(Arch Linux i686)上运行时, countvariables永远不会超过2!

 while (...) { count++; //succesfully increments } return count; //it's maximum 2! 

但是,如果我添加printf():

 while (...) { count++; //succesfully increments printf("%d", anything); } return count; //value as expected 

打印空字符或fflush stdout在这里不起作用。 我必须打印至less一个字符,只有这个variables是好的。 这让我疯狂。

有人可以告诉我,为什么我甚至不得不使用这种“解决方法”? 这可能是我的Linux环境的一个问题? (没什么特别的,GCC 4.8,股票内核)谢谢。

PS整个来源在这里http://pastebin.com/4eEHMbKn 。 是的,这是一个家庭作业:)我需要创build一个类似grep的实用程序在单独的进程中处理每个文件。

Solutions Collecting From Web of "奇怪:printf()影响variables值"

您的KMP_index()调用KMP_failure()来初始化failure[]数组。 不幸的是, KMP_failure()无法初始化数组的第一个元素。

KMP_index()确实检查failure[]的第一个元素。 由于该值未设置,因此KMP_index()的结果是半随机的,这取决于以前的函数调用如何使用堆栈(局部变量)。 这解释了为什么该函数的结果取决于在KMP_index()调用之前您要调用的KMP_index()

(我注意到你的代码在GCC 4.6.3上编译时没有任何警告,所以编译器也没有注意到。)

很可能你的成功测试是在一个64位的平台上进行的,在这个平台上偶尔会出现与该阵列的第一个元素不同的地方,而不是那个32位的Atom架构。 特别是, printf()改变了这种情况,因为它使用了相当多的堆栈: KMP_index()的下一次调用将得到一个failure[]数组,剩下的初始元素是从printf()左边剩余的。

事实上,使用-m32-m64编译以及不同的优化设置( -Os-O3 )会在failure[]中的第一个元素中产生不同的半随机值。

希望这可以帮助。