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

时间:2017-07-17 17:06:03

标签: c arrays cs50

当我尝试打印数组中的所有值(应该为零?)时,它会开始打印0,但最后会打印出数字:

“(打印零)... 0,0,0,0,0,0,0,1810432,0,1809600,0,1809600,0,0,0,5,0,3907584 ...”

当我扩展数组时,只在结尾处数字开始变得混乱。这是内存限制还是什么?非常困惑,如果有人能帮助新手,我将非常感激。

在CS50IDE中完成,不确定是否会改变任何内容

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

4 个答案:

答案 0 :(得分:2)

您的阵列未初始化。您只需声明它但从未实际设置它。在C(和C ++,Objective-C)中,您需要手动设置起始值。与Python,Java,JavaScript或C#不同,这不适合你......

  

应该为零?

以上断言不正确。

答案 1 :(得分:0)

之所以发生这种情况,是因为你保留了100000 * 4 = 400000字节的内存但没有写任何东西(没有初始化它)。

因此,如果您访问尚未写入的内存位置,则会打印垃圾。不打印0的原因是因为我们需要优化并且不希望编译器在写入100000个整数地址时浪费时间,并且最佳实践也希望开发人员永远不会访问他从未写入或分配的内存位置然而。如果您尝试打印:

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

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

亲自尝试

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

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

答案 2 :(得分:0)

在C中声明数组时,默认情况下它不会将元素设置为零。相反,它将填充最后在内存中占据该位置的任何数据,这可能是任何内容。

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

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

答案 3 :(得分:0)

auto个变量(在没有static关键字的块中声明的变量)在创建时不会初始化为任何特定值;他们的价值是不确定。您不能依赖该值为0或其他任何值。

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

您可以通过执行

将数组的所有元素初始化为0
int counter [100000] = {{0}};

如果初始化程序中的元素少于数组中的元素,那么额外的元素将被初始化为,就像它们是static - 0或NULL一样。因此,第一个元素显式初始化为0,其余99999个元素隐式初始化为0.