Определение массива структур в C? - PullRequest
2 голосов
/ 13 ноября 2011

main.h

#define  DATA  struct   data
DATA
{
  int id;
  char data;
}

main.c

DATA *listOfData[100];

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

printf(listOfData[5]->data);

Это не позволяет мне сделать это, прогон просто останавливается на последнем отпечатке ... без ошибок или чего-то еще.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2011

Это потому, что вы определили массив указателей.Но вы никогда не инициализировали ни одного из указателей.

Поэтому:

printf(listOfData[5]->data);

будет аварийно завершать работу (неопределенное поведение), поскольку вы разыменовываете (недопустимый) указатель в индексе 5.

* (И это очень странный способ определения структуры ...)

Чтобы исправить эту проблему, вам нужно выделить для каждого из указателей в массиве.Если вам на самом деле не нужно, чтобы он был массивом указателей, то может быть лучше просто сделать его массивом самой структуры:

DATA listOfData[100];

и получить к нему доступ:

listOfData[5].data

Тогда вам не нужно разбираться с выделением каждого элемента.

1 голос
/ 13 ноября 2011

Я не уверен, почему printf просто замерзнет, ​​но с этим несколько вещей не так.Во-первых, все указатели в вашем массиве DATA* неинициализированы.Вы, вероятно, намеревались создать массив DATA вместо массива DATA указателей:

DATA listOfData[100];

Вы также не заканчивали структуру точкой с запятой, поэтому вряд ли этодаже скомпилируйте:

#define  DATA  struct   data
DATA
{
  int id;
  char data;
};

Наконец, вы используете printf довольно небезопасно;первый аргумент должен быть строкой формата, или вы можете получить странное поведение, если в первом аргументе есть %:

printf("%c\n", listOfData[5].data);
0 голосов
/ 13 ноября 2011

Вы не показали никакого выделения памяти для DATA *. Либо объявите ваш массив как массив данных структуры, например:

DATA listOfData[100];

или выделите память динамически и назначьте указатели в вашем массиве.

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