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

2 回答 2

4

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

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

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

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

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

你想要:

  1. s的数组TinCan?如果是这样,您不需要循环 - 当您要求时,空间已经分配10 * sizeof(TinCan)

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

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

    并保持循环。


一些一般性评论:

  • 您不需要在malloc()调用之前进行强制转换 - 请参阅 -我是否强制转换 malloc 的结果?

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

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

于 2013-05-01T06:37:52.360 回答
3

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

将 canArray 的声明更改为:

TinCan *canArray[] = malloc(10 * sizeof(TinCan*));
于 2013-05-01T06:35:13.793 回答