这是一段代码:
int somefunc() {
/* ... */
while ((pos = KMP_index(array, size, pattern, plen)) > -1) {
count++;
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
somefunc() 在多个子进程中调用,每个fork一次调用.
我的代码在Linux x86_64和i386上编译并按预期工作.但是当我在Atom上网本(Arch Linux i686)上运行它时,count变量永远不会超过2!
while (...) {
count++; //succesfully increments
}
return count; //it's maximum 2!
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加printf():
while (...) {
count++; //succesfully increments
printf("%d", anything);
}
return count; //value as expected
Run Code Online (Sandbox Code Playgroud)
打印空字符或fflushstdout在这里不起作用.我必须打印至少一个字符,然后才变量很好.它让我疯了.
有人可以告诉我,为什么我甚至不得不使用这种"解决方法"?这可能是我的linux环境的问题吗?(没什么特别的,GCC 4.8,库存内核)谢谢.
PS整个来源是http://pastebin.com/4eEHMbKn.是的,这是一个功课:)我需要创建一个类似grep的实用程序,在单独的进程中处理每个文件.
您KMP_index()调用KMP_failure()初始化failure[]数组.不幸的是,KMP_failure()无法初始化数组的第一个元素.
KMP_index()确实检查了第一个元素failure[].因为该值未设置,所以结果KMP_index()是半随机的,这取决于先前函数调用堆栈(局部变量)的方式.这解释了为什么该函数的结果取决于您在调用之前KMP_index()调用的内容.
(我注意到你的代码编译时没有在GCC 4.6.3上发出任何警告,因此编译器也没有注意到.)
最有可能的是,您的成功测试是在64位平台上进行的,其中偶然事件会使该数组的第一个元素与该32位Atom体系结构不同.特别是,printf()改变了这种情况,因为它使用了相当多的堆栈:下一次调用KMP_index()将获得一个failure[]数组,其中初始元素从调用后剩下的垃圾中遗留下来printf().
实际上,使用-m32和编译-m64不同的优化设置(-Os,-O3)会在第一个元素中生成不同的半随机值failure[].
希望这可以帮助.