#include <stdio.h>
int main(void) {
int memo[1000];
for (int i = 0; i < 1000; i++) {
printf("%dt", memo[i]);
}
return 0;
}
我认为所有内容都应该初始化为0,但事实并非如此。这有什么原因吗?非常感谢你的帮助。
函数体中使用自动存储在本地定义的对象在C中是未初始化的。这些值可以是任何值,包括某些体系结构上的陷阱值,这些值只需读取就会导致未定义的行为。
您可以将此数组初始化为int memo[1000] = { 0 };
。第一个元素被显式初始化为0
,所有剩余的元素也将被初始化为0
,因为任何缺少初始化器的元素都将被设置为0
。
为了完整性,int memo[1000] = { 42 };
将其第一个元素设置为42
,并将所有剩余元素设置为0
。类似地,C99初始化器int memo[1000] = { [42] = 1 };
将其第43个元素设置为1
,并且将所有其他元素设置为0
。
在C中,当您执行时
int memo[1000];
你在内存中分配了1000个小位置。这些点当前可能已经或可能没有保存一些垃圾数据。因此,初始化所有变量通常被认为是一种很好的做法。它将使调试更容易。
您可以将上述行替换为,
int memo[1000] = {0};
将数组的每个元素初始化为0;
编辑:正如这里的其他答案所说,你所经历的行为肯定有更深层次的原因。但是,如果你是一个C或编程的初学者。这足以让您在初始化时开始使用数组,而不会被更复杂的细节所淹没。如果你更高级,那么请听从其他答案。
来自C标准(6.7.9初始化(
10如果具有自动存储持续时间的对象未初始化明确地说,它的值是不确定的如果对象具有静态或者线程存储持续时间没有明确初始化,则:
--如果它具有指针类型,则将其初始化为空指针;
--如果它具有算术类型,则初始化为(正数或无符号(零;
--如果它是一个聚合,则每个成员都被初始化(递归(根据这些规则,并且任何填充都被初始化为零位;
--如果是并集,则初始化第一个命名成员(递归地(根据这些规则,并且任何填充都被初始化至零位;
和
19。。。所有未显式初始化的子对象隐式初始化与具有静态存储的对象相同期间
因此在该程序中
#include <stdio.h>
int main(void) {
int memo[1000];
for (int i = 0; i < 1000; i++) {
printf("%dt", memo[i]);
}
return 0;
}
数组CCD_ 11具有自动存储持续时间并且根据所提供的来自C标准的引用。
你可以像一样声明数组
int memo[1000] = { 0 };
在这种情况下,数组的第一个元素由0显式初始化,所有其他元素也由0隐式初始化。
您可以选择要显式初始化的数组的任何元素,例如
int memo[1000] = { [999] = 0 };
如果你想写
#include <stdio.h>
int memo[1000];
int main(void) {
for (int i = 0; i < 1000; i++) {
printf("%dt", memo[i]);
}
return 0;
}
或
#include <stdio.h>
int main(void) {
static int memo[1000];
for (int i = 0; i < 1000; i++) {
printf("%dt", memo[i]);
}
return 0;
}
则数组的元素将被零初始化,因为在文件作用域中声明的变量或用存储说明符CCD_。