我正在通过K& R练习1-13,我忘了将我的数组中的元素设置为0.令我惊讶的是,打印数组时我得到的最后一个值是32767;后续测试对阵列有不同的元素值,有些不同,有些则不同。
我想知道为什么会这样。如果它非常复杂,那么简单来说会发生什么?
#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* print the length of words as input to a histogram with horizontal bars */
int main() {
int c, i;
int state = OUT;
int accum = 0;
int nchar[10];
while ((c = getchar()) != EOF) {
if (c != ' ' && c != '\n' && c != '\t') {
state = IN;
++accum;
}
else {
state = OUT;
++nchar[accum];
accum = 0;
}
}
for (i = 0; i < 10; ++i)
printf("%d\n", nchar[i]);
return 0;
}
输入&amp;相应的输出:
hello codes
4195584
0
0
0
4196032
2
4195584
0
-1608045280
32767
答案 0 :(得分:1)
这就是当你没有初始化你的记忆时会发生什么。在你的程序宣称之前,你得到了所有的东西......
答案 1 :(得分:1)
无论先前在您的地址空间中运行的程序是什么。因此,如果程序在地址0xabcd5657处放置了77,然后您读取了该地址,那么您将得到77.这是因为C不会为您初始化内存零,尽管您可以使用{{1} }:
memset
答案 2 :(得分:1)
创建数组时,编译器会声明堆栈中的内存。如果要初始化数组或(通常)为其分配值,则会将数据写入该内存位置。
如果你没有初始化任何东西,只要声明内存,之前已经使用了内存。删除数据后堆栈不会归零,因为它会浪费太多的处理器时间,而RAM无论如何都会再次填满数据。