Как инициализировать массив указателей в NULL, который находится внутри структуры, а структура находится в массиве других структур - PullRequest
2 голосов
/ 25 мая 2019

Итак, у меня есть структура, в которой есть массив указателей (на другую структуру).Я пытался инициализировать этот массив в NULL, но кажется, что вы не можете сделать это в C. Как вы инициализируете массив Rpr в NULL?

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

typedef struct {maillon *Rpr [7];} repere;
repere R[26];

for(int i=0;i<26;i++){
   R[i].Rpr={NULL};
}

он выдает некоторые случайные незначительные ошибки.

Ответы [ 4 ]

3 голосов
/ 25 мая 2019

C различает присваивание (которое является выражением) и инициализацию (которое является частью определения переменной). В частности, синтаксис = { ... } действителен только для инициализации.

Если вы хотите сделать это с отдельным циклом, вам нужно два вложенных цикла (или много повторяющегося кода для установки всех элементов):

for (int i=0; i<26; i++) {
    for (int j = 0; j<7; j++) {
        R[i].Rpr[j] = NULL;
    }
}

В качестве альтернативы, просто используйте инициализацию:

repere R[26] = { { { NULL } } };

Технически это только инициализирует первый элемент внутреннего массива в структуре в первом элементе внешнего массива, но C не имеет "полуинициализированных" переменных. Правило состоит в том, что если есть инициализатор, который не покрывает все поля переменной, они неявно устанавливаются в ноль. Для указателей это означает, что все они являются нулевыми указателями.

Фактически, этот инициализатор «все инициализировать с 0» можно сделать как более коротким, так и более общим:

repere R[26] = { 0 };

Этот { 0 } инициализатор работает и для других типов. (Некоторые компиляторы предупреждают об этой конструкции (« отсутствует фигурные скобки в инициализаторе » и т. П.). Эти компиляторы глупы и должны остановиться.)

1 голос
/ 25 мая 2019

Простой метод

   memset(R, 0, sizeof(R));
1 голос
/ 25 мая 2019

Вы должны сделать что-то вроде этого:

for(int i=0;i<26;i++){
    for(int j=0; j<7; j++)
       R[i].Rpr[j]=NULL;
}

Но вы можете полностью пропустить цикл, написав repere R[26]={0}; Это приведет к тому, что вся память структуры обнулится, независимо от того, сколько существует полей или какого они типа.

0 голосов
/ 25 мая 2019

Как указали другие, Здесь

maillon *Rpr [7];

Rpr - это массив указателей maillon типа , и вам нужно инициализировать каждый указатель с помощью NULL.Например,

for (int i=0; i<26; i++) {
    for (int j = 0; j<7; j++) { /* Rpr is array of 7 pointers, so rotate 7 times */
        R[i].Rpr[j] = NULL; /* initializing each Rpr[index] with NULL */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...