Предупреждение компилятора: несовместимый с инициализацией тип указателя

#c

#c

Вопрос:

Я новичок в C, и я не могу понять, почему я получаю предупреждение о несовместимом с инициализацией типе poniter.Соответствующие части кода:

 struct a {
  int address;
  B * apples[8];
} A;

struct b {
  int color;
} B;
  

У меня есть массив A, называемый a_list . То, что я сейчас делаю, это:

 B *b_list = a_list[i].apples;   // i being an index in for loop
b_list[6].color = 0;
  

Приведенное выше работает корректно, но выдает предупреждение:

   Initialization from incompatible pointer type. 
  

Чтобы исправить это, я рассуждаю о том, что я должен делать

 B ** b_list = a_list[i].apples;  // as it is pointer to pointer. 
So now b_list basically points to a pointer which points to an array of 6, yea?
So: (*b_list)[6].color          // However this causes segmentation fault.
  

Он также работал правильно, когда в структуре A было B яблок [8], а не B * яблок [8] . Однако использование этого решения не поддерживает изменения, внесенные в функции за пределами того места, где они были сделаны.

Пожалуйста, посоветуйте.

Ответ №1:

A и B являются не типами, а экземплярами struct a и struct b . Возможно, вы хотите использовать классическую идиому C, но вам не хватает typedef :

 typedef struct a {
    ...
} A;
  

Теперь struct a и A это одно и то же.

В вашем последнем фрагменте кода (*b_list)[6].color на самом деле должно быть (*b_list[6]).color или еще лучше b_list[6]->color .

Комментарии:

1. Оба вышеперечисленных причины ошибок сегментации. Это потому, что некоторые блоки не были обработаны malloced?

2. @Catie: Вы выделили каждый из B s в массиве?

Ответ №2:

Он также работал правильно, когда в структуре A было B яблок [8], а не B * яблок [8] . Однако использование этого решения не поддерживает изменения, внесенные в функции за пределами того места, где они были сделаны.

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