c - 两个几乎完全相同的程序但输出不同

标签 c algorithm gcc

嗨,我制作了一个非常简单的程序,应该可以工作,但它不起作用:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int usedNumbers[256];
    memset(usedNumbers,0,256);

    srand(time(NULL));

    for(int i=0; i<256; ++i){
        while(1){
            int r = rand()%256;
            if( !usedNumbers[r] ){
                usedNumbers[r] = 1;
                break;
            }
            printf("Test: %03d -> %03d\n", i, r);
        }
    }

    return 0;
}

该程序的想法是在屏幕上以随机顺序打印从 0 到 255 的数字,但程序在 32 位计算机上停止在第 84 个数字上,在 64 位计算机上停止在第 144 个数字上。如果我只移动“intusedNumbers[256];”在函数上面这样:

#include <string.h>

int usedNumbers[256];

int main(int argc, char *argv[]) {

程序按预期运行。 为什么会这样呢? 我正在使用最新的 GNU/GCC 编译器和 C11 标准。

最佳答案

usedNumbers内部main是一个局部变量,它们不是零初始化的(即它们可以包含垃圾)。由于您只使用 memset(..., 256),因此只有前 256 个字节被零初始化,其余部分(例如数组的一半或四分之三 - - 或更多,取决于 int 的大小)不是。

usedNumbers outside main 是一个全局变量,但是,即使没有 memset<,它们也是完全零初始化的。因此,您确实有一个空数组,其中没有垃圾,这就是它按预期工作的原因。

这样做:

    memset(usedNumbers, 0, sizeof(usedNumbers));

两个版本应该产生相同的预期结果。

关于c - 两个几乎完全相同的程序但输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165190/

相关文章:

c++ - 概念检查器无法在 gcc 上编译,因为它是 'has no linkage'

c++ - GCC对纯函数的优化

c - 逐个移动数组元素

C: 动态链接 OpenSSL 库时出错

c - 为什么我们不能用双指针来表示二维数组呢?

algorithm - remove_if 不起作用,不确定是什么问题

algorithm - 具有平行边的有向图的最小权重生成树

algorithm - 给定一组矩形,是否有重叠?

c - 如果使用 __INLINE__,速度会提高多少?

c - C中的二进制图像类型