在C中初始化int数组而不分配值

时间:2015-09-06 19:57:16

标签: c arrays

我正在通过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

3 个答案:

答案 0 :(得分:1)

这就是当你没有初始化你的记忆时会发生什么。在你的程序宣称之前,你得到了所有的东西......

答案 1 :(得分:1)

无论先前在您的地址空间中运行的程序是什么。因此,如果程序在地址0xabcd5657处放置了77,然后您读取了该地址,那么您将得到77.这是因为C不会为您初始化内存零,尽管您可以使用{{1} }:

memset

答案 2 :(得分:1)

创建数组时,编译器会声明堆栈中的内存。如果要初始化数组或(通常)为其分配值,则会将数据写入该内存位置。

如果你没有初始化任何东西,只要声明内存,之前已经使用了内存。删除数据后堆栈不会归零,因为它会浪费太多的处理器时间,而RAM无论如何都会再次填满数据。