C 编译器警告:初始化不兼容指针类型

C 编译器警告:初始化不兼容指针类型,c,C,我是C新手,我不明白为什么会出现初始化不兼容的poniter类型警告。代码的相关部分是: struct a { int address; B * apples[8]; } A; struct b { int color; } B; 我有一个数组,叫做A_列表。我目前正在做的是: B *b_list = a_list[i].apples; // i being an index in for loop b_list[6].color = 0; 以上操作正常,但会引发警告:

我是C新手,我不明白为什么会出现初始化不兼容的poniter类型警告。代码的相关部分是:

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

struct b {
  int color;
} B;
我有一个数组,叫做A_列表。我目前正在做的是:

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]时,它也能正常工作。但是,使用此解决方案不会保持在函数中所做更改的位置之外进行更改

请给我一些建议

当结构A有B苹果[8]时,它也能正常工作, 而不是B*苹果[8]。但是,使用此解决方案并不能 维护在功能中所做的更改,这些更改不在原来的位置 制造


向这些函数传递一个指向对象的指针,您的更改将在这些函数之外持久存在。他们没有这样做的原因是因为您按值传递对象。

A
B
不是类型,而是
结构A
结构B
的实例。也许您想使用经典的C语言,但缺少了一个
typedef

typedef struct a {
    ...
} A;
现在
struct a
a
是一回事


在您的上一个代码片段中,
(*b_list)[6]。颜色实际上应该是
(*b_list[6])。颜色
或者更好的是
b_list[6]->颜色

以上两者都会导致分段错误。是因为某些块没有被malloced吗?@Catie:您分配了数组中的每个
B
s了吗?