C 数组内存错误?(初学者)
C Array Memory Error?(Beginner)
当我尝试打印数组中的所有值(应该为零?)时,它开始打印 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]);
}
}
您的数组未初始化。您只需声明它但从未真正设置它。在 C(和 C++,Objective-C)中,您需要手动设置一个起始值。与 Python、Java、JavaScript 或 C# 不同,这不是为您完成的...
which should be zero?
以上说法不正确。
发生这种情况的原因是因为您保留了 100000*4 = 400000 字节的内存但没有向其中写入任何内容(没有对其进行初始化)。
因此,如果您访问尚未写入的内存位置,则会打印垃圾。不打印 0 的原因是因为我们想要优化并且不希望编译器浪费时间写入 100000 个整数地址,而且最佳实践期望开发人员永远不会访问他从未写入或分配的内存位置然而。如果您尝试打印:
printf("%d\n", counter[100000]);
这也会打印一个垃圾值,但你没有分配那个,是吗?这是因为 C/C++ 不像 Java.
那样在您尝试执行此类操作时不会限制或引发错误
自己试试
for (int i=0; i<100000; i++) {
counter[i] = i;
printf("%d\n", counter[i]);
}
现在屏幕上只会打印 1,2,3....99999 中的数字。
在 C 中声明数组时,默认情况下它不会将元素设置为零。相反,它将填充内存中最后占据该位置的任何数据,可以是任何内容。
数组的第一部分包含零这一事实纯属巧合。
数组的这种起始状态称为 "uninitialized" 数组,因为您还没有为数组提供任何初始值。在你可以使用数组之前,它应该是"initialized",意思是你为每个位置指定一个默认值。
auto
变量(在没有 static
关键字的块中声明的变量)在创建时不会初始化为任何特定值;它们的值为 不确定。您不能依赖该值为 0 或其他任何值。
static
变量(在文件范围内或使用 static
关键字声明)根据类型初始化为 0 或 NULL
。
您可以通过
将数组的所有元素初始化为 0
int counter [100000] = {{0}};
如果初始化器中的元素少于数组中的元素,那么额外的元素将被初始化就像它们是static
- 0或NULL
。所以第一个元素被显式初始化为0,剩下的99999个元素被隐式初始化为0。
当我尝试打印数组中的所有值(应该为零?)时,它开始打印 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]);
}
}
您的数组未初始化。您只需声明它但从未真正设置它。在 C(和 C++,Objective-C)中,您需要手动设置一个起始值。与 Python、Java、JavaScript 或 C# 不同,这不是为您完成的...
which should be zero?
以上说法不正确。
发生这种情况的原因是因为您保留了 100000*4 = 400000 字节的内存但没有向其中写入任何内容(没有对其进行初始化)。
因此,如果您访问尚未写入的内存位置,则会打印垃圾。不打印 0 的原因是因为我们想要优化并且不希望编译器浪费时间写入 100000 个整数地址,而且最佳实践期望开发人员永远不会访问他从未写入或分配的内存位置然而。如果您尝试打印:
printf("%d\n", counter[100000]);
这也会打印一个垃圾值,但你没有分配那个,是吗?这是因为 C/C++ 不像 Java.
那样在您尝试执行此类操作时不会限制或引发错误自己试试
for (int i=0; i<100000; i++) {
counter[i] = i;
printf("%d\n", counter[i]);
}
现在屏幕上只会打印 1,2,3....99999 中的数字。
在 C 中声明数组时,默认情况下它不会将元素设置为零。相反,它将填充内存中最后占据该位置的任何数据,可以是任何内容。
数组的第一部分包含零这一事实纯属巧合。
数组的这种起始状态称为 "uninitialized" 数组,因为您还没有为数组提供任何初始值。在你可以使用数组之前,它应该是"initialized",意思是你为每个位置指定一个默认值。
auto
变量(在没有 static
关键字的块中声明的变量)在创建时不会初始化为任何特定值;它们的值为 不确定。您不能依赖该值为 0 或其他任何值。
static
变量(在文件范围内或使用 static
关键字声明)根据类型初始化为 0 或 NULL
。
您可以通过
将数组的所有元素初始化为 0int counter [100000] = {{0}};
如果初始化器中的元素少于数组中的元素,那么额外的元素将被初始化就像它们是static
- 0或NULL
。所以第一个元素被显式初始化为0,剩下的99999个元素被隐式初始化为0。