代码之家  ›  专栏  ›  技术社区  ›  Jeff Guan

C阵列内存错误?(初学者)

  •  -3
  • Jeff Guan  · 技术社区  · 8 年前

    “(打印零)…0,0,0,0,0,0,01810432,01809600,01809600,0,0,0,5,03907584…”

    当我扩展数组时,只有在最后,数字才会开始混乱。这是内存限制还是什么?非常困惑,如果有人能帮助新手,我将不胜感激。

    在CS50IDE中完成,不确定这是否会改变什么

    int main()
    {
      int counter [100000];
      for(int i = 0; i < 100000; i++)
      {
        printf("%i,", counter[i]);
      }
    }
    
    4 回复  |  直到 8 年前
        1
  •  2
  •   Frank V    8 年前

    哪个应该是零?

    上述断言不正确。

        2
  •  0
  •   John Bode    8 年前

    auto static 不确定的 。你不能依赖于该值为0或任何其他值。

    变量(在文件范围内声明或使用 关键字)初始化为0或 NULL ,取决于类型。

    您可以通过执行以下操作将数组的所有元素初始化为0

    int counter [100000] = {{0}};
    

    好像 他们是 静止的 无效的 所以第一个元素是 初始化为0,其余99999个元素为 含蓄地

        3
  •  0
  •   Danyal Imran    8 年前

    发生这种情况的原因是,您保留了100000*4=400000字节的内存,但没有写入任何内容(没有初始化)。

    printf("%d\n", counter[100000]);
    

    这也会打印一个垃圾值,但你没有分配它,是吗?这是因为与Java不同,C/C++在尝试执行此类操作时不会限制或引发错误。

    for (int i=0; i<100000; i++) {
        counter[i] = i;
        printf("%d\n", counter[i]);
    }
    

    现在屏幕上只会打印1,2,3…99999的数字。

        4
  •  0
  •   Cerulean Chelonii    8 年前

    在C中声明数组时,默认情况下不会将元素设置为零。取而代之的是,它将填充上次占用内存中该位置的任何数据,可以是任何数据。

    数组的第一部分包含零这一事实只是巧合。

    数组的这个开始状态称为“未初始化”数组,因为您没有为数组提供任何初始值。在使用数组之前,它应该“初始化”,这意味着您为每个位置指定了一个默认值。