2013-05-01 99 views
2

我已经阅读了一些类似的问题,但我仍然无法看到我要出错的地方。当初始化结构数组时出现错误(不兼容的类型)

我的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)); 
    } 
} 

回答

4

猜你有一个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()呼叫前投 - 见 - Do I cast the result of malloc?

  • 它使用sizeof(varname[0])很好的做法,而不是​​,以避免(或更明显)愚蠢的错误。

  • 与电流回路代码,您将离开最后TinCan未初始化 - 你在canArray创建10个条目,但只有初始化其中9 i < 9。更改为i < 10,或额外的信用,换出一个#define NUMBER_OF_CANS 10

+0

谢谢,我明白了。如果我现在要将该数组传递给初始化方法,它会是这样吗? intitialise(canArray **)?这不适合我。 – Dawson 2013-05-01 06:46:38

+1

没关系。你可以有一个函数初始化一个数组或一个指针数组。我可能会采用第一种方法(指向10个TinCan的指针),因为代码会更清晰。 – 2013-05-01 06:48:43

+1

此外,重要的是要记住,数组和指针是不一样的 - 如果这听起来很混乱,请阅读http://c-faq.com/aryptr/aryptr2.html – 2013-05-01 06:50:52

3

你有声明了一个TinCan结构体的数组,但是你的循环表明你需要一个指向TinCan结构体的指针数组。

变化canArray的声明:

TinCan *canArray[] = malloc(10 * sizeof(TinCan*)); 
相关问题