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



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

"(打印零(...0,0,0,0,0,0,0,1810432,0,1809600,0,1809600,0,0,0,5,0,0,3907584...">

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

CS50IDE完成,不确定这是否会改变任何东西

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

数组未初始化。你只是声明它,但从未实际设置它。在C(和C++,Objective-C(中,你需要手动设置一个起始值。与Python,Java,JavaScript或C#不同,这不是为你完成的......

哪个应该是零?

上述断言是不正确的。

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

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

你可以通过

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

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

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

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

printf("%dn", counter[100000]);

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

自己尝试一下

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

现在只有来自1,2,3....99999的数字将打印在屏幕上。

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

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

数组的这种开始状态称为"未初始化"数组,因为您尚未为数组提供任何初始值。在使用数组之前,应该对其进行"初始化",这意味着您为每个位置指定一个默认值。

最新更新