Инициализация массива указателей на структуры в C - PullRequest
0 голосов
/ 03 мая 2011

У меня есть массив указателей на структуры.Я хочу инициализировать каждый элемент в массиве в NULL.Я собираюсь использовать этот массив для динамического добавления и удаления записей, поэтому я хочу иметь возможность проверить на NULL, чтобы убедиться, что этот индекс пуст.

Я пытался сделать это так:

struct mystructure *cxs[MAXNOCXS];

int cx_init(void)
{
    int i = 0;
    for (i=0; i<MAXNOCXS; i++)
        cxs[i] == NULL;
    return 0;
}

но мой компилятор говорит мне:

error: statement with no effect

со ссылкой на строку cxs[i] = NULL;

Массивы указателей автоматически инициализируются в NULL в C?Если нет, то как я мог это сделать?

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Вы используете оператор == вместо оператора =.На практике вместо присвоения NULL cxs[i] (что и было бы, если бы вы использовали оператор присваивания =), вы сравниваете каждый элемент с NULL и отбрасываете результат такого сравнения, таким образом, предупреждениевашего компилятора.

Обратите внимание, что вы можете проще инициализировать свой массив, используя нотацию

struct mystructure * cxs[MAXNOCXS] = {};

Этот синтаксис сообщает компилятору инициализировать по умолчанию 1 всеэлементы массива (так как фигурные скобки, которые будут содержать явные инициализаторы, пусты), это означает, что указатели инициализируются в NULL, а арифметические типы равны 0.

Если ваш массив имеет «статическую длительность хранения»(т.е. это глобальная или static переменная), вам не нужно делать ничего особенного, потому что она уже инициализирована по умолчанию.

  1. К значению, к которому они были бы инициализированы, если бы они были static переменными (C99, §6.7.8 ¶10, ¶21).

Редактировать

После прочтения кажется, что стандарт C, в отличие от стандарта C ++, не поддерживает пустые инициализаторы.Тем не менее, вы всегда можете сделать:

struct mystructure * cxs[MAXNOCXS] = {NULL};

, который будет инициализировать первый элемент с NULL, и позволить другим элементам инициализироваться по умолчанию (снова на NULL).

2 голосов
/ 03 мая 2011

Вы заметите, что ваша линия cxs[i] == NULL;, а не cxs[i] = NULL;, как вы предполагали.

Кроме того, так как кажется, что ваш массив был объявлен в глобальной области видимости (и поэтому имеет статическая длительность хранения ), все его элементы будут по умолчанию инициализированы нулями, поэтому указатели уже будут все равно NULL. (Обратите внимание, что это наиболее определенно не случай стандартных локальных переменных внутри функций).

1 голос
/ 03 мая 2011

Кажется, в вашем коде есть опечатка, и вы случайно используете оператор сравнения вместо присваивания - вот что говорит вам компилятор о

for (i=0; i<MAXNOCXS; i++)
        cxs[i] == NULL;

должно быть

for (i=0; i<MAXNOCXS; i++)
        cxs[i] = NULL;
...