Предупреждение компилятора: инициализация несовместимого типа указателя - PullRequest
2 голосов
/ 19 октября 2011

Я новичок в 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].Тем не менее, использование этого решения не сохраняет изменения, внесенные в функции вне того места, где они были сделаны.

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

Ответы [ 2 ]

1 голос
/ 19 октября 2011

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.

0 голосов
/ 19 октября 2011

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

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

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