Int数组给出疯狂的值,除非所有字段初始化为0,为什么?
int array gives crazy values unless all fields initialized to 0, why?
int TwoThrows();
int main(){
int Throws, Throw, Frequency[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
randomize();
cout << "nThis program simulates throws of two dice.";
cout << "nnHow many throws : ";
cin >> Throws;
// Calls TwoThrows and saves in Frequency by value
for(int I=0; I<Throws; I++){
Throw=TwoThrows(); //2-12
Frequency[Throw]++; //2-12
}
// Prints array:
for(int I=0; I<11; I++){
cout << I+2 << ":t" << Frequency[I+2] << "n";
}
return 0;
}
int TwoThrows(){
unsigned int I=(random(6)+1)+(random(6)+1);
return I;
}
这个打印:
2: 13173: 27244: 41455: 55136: 70567: 83438: 69829: 558010: 417611: 277612: 1388
这很好。
然而,我想知道的是,为什么我必须将数组设置为{0,0,0,0,0,0,0,0,0,0,0}?
如果我不这样做;我:
2: 306268683: 16382334: 8445452955: 16: 97: 42025108: 41991979: 84455575710: 311: 420257412: 2130567168
如果你不初始化数组,然后继续增加它的元素,从技术上讲,这是未定义的行为。
实际情况是,当main()
开始时,数组的元素得到堆栈上的任何值。
局部变量放在函数的堆栈上。编译器或操作系统不会初始化该区域。这意味着局部变量的值正是调用函数时内存中的值,这可能不是您想要的。
当你分配一个数组时,你在内存中得到了一个地方,所以这个地方可以被另一个应用程序使用,所以如果不初始化那个地方,它会根据哪个应用程序使用那个地方给你意想不到的值。
试着这样理解它。所有的内存位置都被占用,当我们将一个特定的内存位置分配给一个变量时,它将转换该位置保存的原始值,也称为垃圾值,因此我们得到意想不到的值。
但是当你初始化一个变量或数组时,默认的垃圾值被指定的值所替换,我们得到想要的输出。
相关文章:
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 为什么 MSVC 和 GCC 不能使用具有默认值的字段初始化结构
- 隐式字段初始化的规则
- 在 Qt 创建器中禁用 -wmissing 字段初始值设定项警告
- 初始化构造函数中的字段-初始化器列表与构造函数正文
- C++中模板类中的静态字段初始化
- 构造函数中的字段初始化会损坏内存
- 如何从字符串字面值初始化无符号字符数组
- c++ 11统一初始化:字段初始化不是常量
- 非阻塞TCP套接字在初始化时挂起(c++)
- 在c++中使用浮点字面值初始化整型数组的成员
- 用字符串字面值初始化char *类成员
- Int数组给出疯狂的值,除非所有字段初始化为0,为什么?
- 从字符串字面值初始化字符数组是否属于数组复制初始化的情况?
- 关于 VC++ 和 Sun Studio 中的字段初始化顺序、签名比较和未使用的变量的警告
- 结构可以在方法主体中声明,但前提是它不包含成员字段初始值设定项。编译器错误与否?
- 如何在构造函数中禁用字段初始化
- 通过设置为字符串字面值初始化的c++大小的char数组会导致数组边界溢出
- 空的大括号init列表会发出关于缺少字段初始值设定项的警告