C数组内存错误?(初学者)

C数组内存错误?(初学者),c,arrays,cs50,C,Arrays,Cs50,当我尝试打印数组中的所有值(哪个应该是零?)时,它会开始打印0,但最后会打印不稳定的数字: (打印零)…0,0,0,0,0,0,01810432,01809600,01809600,0,0,5,03907584…” 当我扩展数组时,只有在最后,数字才会开始混乱。这是内存限制还是什么?非常困惑,如果有人能帮助新手,我将不胜感激 在CS50IDE中完成,不确定这是否会改变什么 int main() { int counter [100000]; for(int i = 0; i < 1

当我尝试打印数组中的所有值(哪个应该是零?)时,它会开始打印0,但最后会打印不稳定的数字:

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

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

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

int main()
{
  int counter [100000];
  for(int i = 0; i < 100000; i++)
  {
    printf("%i,", counter[i]);
  }
}
intmain()
{
整数计数器[100000];
对于(int i=0;i<100000;i++)
{
printf(“%i”,计数器[i]);
}
}

您的阵列未初始化。您只需声明它,但从未实际设置它。在C(和C++,ObjuleC)中,你需要手动设置一个起始值。与Python、Java、JavaScript或C不同,这不是为您完成的

哪个应该是零


上述断言是不正确的

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

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

printf("%d\n", counter[100000]);
这也会打印一个垃圾值,但您没有分配它,是吗?这是因为与Java不同,C/C++在尝试执行此类操作时不会限制或引发错误

你自己试试看

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

for(int i=0;i在C中声明数组时,默认情况下不会将元素设置为零。相反,它将填充内存中上次占用该位置的任何数据,可以是任何数据

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


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

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

static
变量(在文件范围内声明或使用
static
关键字声明)根据类型初始化为0或
NULL

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

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

如果初始值设定项中的元素少于数组中的元素,则额外的元素将被初始化,就像它们是
静态
-0或
NULL
一样。因此,第一个元素被显式初始化为0,其余99999个元素被隐式初始化为0。

数组未初始化?Va默认情况下,具有自动存储持续时间的变量(局部变量)未初始化。请注意,阵列是在堆栈上分配的,但堆栈的大小有限且相对较小(在类Unix系统上通常为8 MiB,在类WIndows系统上我相信为1 MiB)。如果您使数组更大,它将无法放入堆栈中。如果数组是在文件作用域中定义的,它将默认初始化为零-但是本地(自动)变量不是这样初始化的。您也可以使用动态内存分配-但是
malloc()
不会初始化数据,而
calloc()
可能会说:“您需要手动设置一个起始值”,但这并不适用于所有类型的存储。