gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:33 25 4
gpt4 key购买 nike

您好,我已经制作了一个非常简单的程序,应该可以运行,但它不能运行:

#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 标准。

最佳答案

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

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

也一样:

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com