数组中的C结构

时间:2012-03-15 02:37:31

标签: c arrays pointers struct

假设我有一个数组,其中包含一些定义如下的结构:

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]会不会?

4 个答案:

答案 0 :(得分:2)

是的,这样可以正常工作。听起来你在考虑Java数组。在C中,如果声明某种类型的数组,则实际对象在数组中,而不仅仅是(未初始化的)对象引用。

答案 1 :(得分:1)

初始化取决于变量的定义位置和方式。您的代码没问题(一旦xz混淆了),您的陈述就准确无误。

如果它是文件范围变量(与函数内部相对),可能与外部链接,则在程序启动时初始化。对于全局变量或文件静态变量来说,这是花哨的话题。

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]没有被初始化。