1

这是一段代码:

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

somefunc()在多个子进程中调用,每个 fork 调用一次。

我的代码在 Linux x86_64 和 i386 上按预期编译和工作。但是当我在 Atom 上网本(Arch Linux i686)上运行它时,count变量永远不会超过 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输入标准输出在这里不起作用。我必须打印至少一个字符,然后变量才可以。它让我发疯。

有人可以告诉我,为什么我还要使用这样的“解决方法”?这可能是我的linux环境的问题吗?(没什么特别的,GCC 4.8,股票内核)谢谢。

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

4

1 回答 1

5

您对初始化数组的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[].

希望这可以帮助。

于 2013-04-30T05:53:43.050 回答