Advertencia del comstackdor: Inicialización tipo puntero incompatible

Soy nuevo en C, y no puedo entenderlo, por qué recibo una advertencia de tipo de repetidor incompatible con la inicialización. Las partes relevantes del código son:

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

Tengo una matriz de A llamada a_list. Lo que estoy haciendo actualmente es:

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

Lo anterior funciona correctamente, pero lanza la advertencia:

  Initialization from incompatible pointer type. 

Para arreglarlo, mi razonamiento es que debería estar haciendo

 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. 

También funcionaba correctamente cuando la estructura A tenía manzanas B [8], en lugar de manzanas B * [8]. Sin embargo, el uso de esta solución no mantiene los cambios realizados en funciones fuera de donde se realizaron.

Por favor aconséjame.

También funcionaba correctamente cuando la estructura A tenía manzanas B [8], en lugar de manzanas B * [8]. Sin embargo, el uso de esta solución no mantiene los cambios realizados en funciones fuera de donde se realizaron.

Pase un puntero al objeto a dichas funciones y sus cambios persistirán fuera de ellas. La razón por la que no lo hicieron es porque pasabas el objeto por valor.

A y B no son tipos, sino instancias de struct a y struct b . Tal vez quieras usar el lenguaje C clásico pero te falta un typedef :

 typedef struct a { ... } A; 

Ahora struct a A son la misma cosa.

En el último fragmento de código, (*b_list)[6].color debería ser (*b_list[6]).color o mejor aún b_list[6]->color .