嗨,我制作了一个非常简单的程序,该程序应该可以运行,但是不能:
#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
内部 main
是一个局部变量和这些都不是零初始化(即,它们可以含有垃圾)。由于您仅使用memset(..., 256)
,因此只有前256个字节会被初始化为零,而其余的(例如,数组的一半或四分之三-或更多,取决于的大小int
)不会被初始化。
在usedNumbers
外面 main
是一个全局变量,但是,这些是完全零初始化,即使没有memset
。因此,在那里,您确实有一个没有垃圾的空数组,这就是为什么该数组能按预期工作的原因。
这样:
memset(usedNumbers, 0, sizeof(usedNumbers));
并且两个版本都应产生相同的预期结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句