C структуры в массивах - PullRequest
1 голос
/ 15 марта 2012

Предположим, у меня есть массив, который содержит некоторую структуру, определенную следующим образом:

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 ]

2 голосов
/ 15 марта 2012

Да, это будет работать просто отлично.Похоже, вы думаете о массивах Java.В C, если вы объявляете массив некоторого типа, фактические объекты находятся в массиве, а не просто (неинициализированные) ссылки на объекты.

1 голос
/ 15 марта 2012

Инициализация зависит от того, где и как определяется переменная.Ваш код в порядке (после того, как путаница по 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.

0 голосов
/ 15 марта 2012

Вот пример, который покажет, что вы исправляете по отношению к указателям.

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 
0 голосов
/ 15 марта 2012

В C никогда не предполагайте, что какая-либо память будет инициализирована для вас.

Ваш пример завершился неудачно, потому что ваш массив равен 'x', но вы ссылаетесь на 'z'.Предполагая, что вы имели в виду, что x и z одинаковы: вы создали x [0], но x [1..9] не инициализированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...