初始化struct数组时出错(不兼容的类型)

我已经读过一些类似的问题,但我仍然看不出我出错的地方。

我malloc指针,似乎工作正常,但我在这一行得到一个错误(不兼容的类型):

canArray [i] = (TinCan *) malloc(sizeof(TinCan)) 

这是完整的代码:

 typedef struct TinCan { int date; int time; } TinCan; int main () { int i; TinCan *canArray = malloc(10 * sizeof(TinCan)); for (i =0; i < 9; i++ ) { canArray [i] = (TinCan *) malloc(sizeof(TinCan)); } } 

猜测你有一个typedef struct {...} TinCan; 在某处,然后在这里:

 TinCan *canArray = malloc(10 * sizeof(TinCan)); 

你有足够的空间容纳10个TinCan结构,但在这里:

 canArray [i] = (TinCan *) malloc(sizeof(TinCan)); 

您正在尝试为另一个TinCan结构分配空间。

你想要:

  1. 一系列的TinCan ? 如果是这样,你不需要循环 – 当你要求10 * sizeof(TinCan)时已经分配了空间

  2. 一组指向TinCan结构的指针? 如果是这样,请将第一行更改为:

     TinCan **canArray = malloc(10 * sizeof(canArray[0])); 

    并保持循环。


一些一般性意见:

  • malloc()调用之前你不需要malloc() – 请参阅 – 我是否转换了malloc的结果?

  • 使用sizeof(varname[0])而不是sizeof(typename)是一种好习惯,可以避免(或更明显地)犯下愚蠢的错误。

  • 使用当前循环代码,您将保留最后一个TinCan未初始化 – 您在canArray创建了10个条目,但仅在i < 9初始化其中的9个条目。 将其更改为i < 10或额外信用,将两者换成#define NUMBER_OF_CANS 10

你已经声明了一个TinCan结构数组,但你的循环建议你需要一个指向TinCan结构的指针数组。

将canArray的声明更改为:

 TinCan *canArray[] = malloc(10 * sizeof(TinCan*));