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