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

时间:2016-07-02 23:05:14

标签: 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个数字上停止。如果我只移动“int usedNumbers [256];”在这个函数之上:

#include <string.h>

int usedNumbers[256];

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

程序按预期工作。 为什么会这样? 我使用的是最新的GNU / GCC编译器和C11标准。

1 个答案:

答案 0 :(得分:3)

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

int 外部 usedNumbers是一个全局变量,即使没有main,这些也是完全零初始化的。所以,你真的有一个没有垃圾的空数组,这就是为什么它按预期运行的原因。

所以:

memset

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