假设我有一个数组,其中包含一些定义如下的结构:
static struct s x[10]
数组中的每个元素是否已初始化,或者它们都是空插槽?
换句话说,如果我这样做会发生什么:
struct s {
struct s *next;
};
struct s a;
a.next = &x[0];
x[0].next = &x[1];
a
下一个指向x[0]
和x[0]
的下一个指向x[1]
会不会?
答案 0 :(得分:2)
是的,这样可以正常工作。听起来你在考虑Java数组。在C中,如果声明某种类型的数组,则实际对象在数组中,而不仅仅是(未初始化的)对象引用。
答案 1 :(得分:1)
初始化取决于变量的定义位置和方式。您的代码没问题(一旦x
和z
混淆了),您的陈述就准确无误。
如果它是文件范围变量(与函数内部相对),可能与外部链接,则在程序启动时初始化。对于全局变量或文件静态变量来说,这是花哨的话题。
struct s a[10];
static struct s b[10];
这些是用零初始化的,因为没有明确的初始化器。
函数内的静态变量也初始化为零(在没有显式初始化器的情况下):
int function1(void)
{
static struct s c[10];
...
}
数组c
初始化为零。
除非您提供初始化程序,否则不会初始化自动变量:
int function2(void)
{
struct s d[10]; /* Not initialized */
struct s e[10] = { 0 }; /* Initialized - all 10 elements are zeroed */
struct s f[10] = { &d[0], &d[1], &e[9] };
/* 3 are initialized to given values, the rest to zero */
struct s g[10] = { [9] = &e[9] };
/* The first 9 are zeroed; the last is &e[9] */
}
最后一个是使用C99的指定初始化程序。
答案 2 :(得分:0)
这是一个示例,表明您对指针进行了更正。
int main(int argc, char * argv[]) {
struct listElement {
void * next;
};
struct listElement listElements[10];
struct listElement head;
head.next = &listElements[0];
listElements[0].next = &listElements[1];
listElements[1].next = &listElements[2];
printf("sizeof struct %d\n", sizeof(struct listElement));
printf("%p \n", head.next);
printf("%p \n", listElements[0].next);
printf("%p \n", listElements[1].next);
}
输出:
sizeof struct 4
0039FE30
0039FE34
0039FE38
答案 3 :(得分:-1)
在C中,永远不要假设任何记忆都会为你启动。
您的示例失败,因为您的数组是'x',但您引用'z'。假设你的意思是x和z是相同的:你有x [0],但x [1..9]没有被初始化。