0

我声明并尝试初始化一个结构指针数组。它编译没有错误,但这个循环总是在 8 个循环后使程序崩溃:

for(ii = 0; ii < 10; ii++)
    {
    canArray[ii]->AC = 0;
    printf("%d - AC is %d\n", ii, canArray[ii]->AC);
    }

完整代码在这里:

typedef struct Can
    {
    int AC;
    } Can;


int main (int argc, char* argv[])
    {
        int i, ii;

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

        for (i =0; i < 10; i++)
            {
            canArray[i] = (Can*) malloc(sizeof(Can));
            }

        for(ii = 0; ii < 10; ii++)
            {
            canArray[ii]->AC = 0;
            printf("%d - AC is %d\n", ii, canArray[ii]->AC);
            }

    }
4

3 回答 3

3

您在分配内存时遇到了一些问题。您想为 Can 结构的 10 个指针分配空间。但你做错了。

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

像这样做:

Can **canArray= malloc(10 * sizeof(Can *)); 
于 2013-05-01T07:43:13.900 回答
1

这里需要为 Can 结构的 10 个指针分配空间。为此,您需要编写

可以 **canArray= malloc(10 * sizeof(Can*));

代替Can **canArray= malloc(10 * sizeof(Can[0]));

于 2013-05-01T07:55:59.660 回答
1

Can是一种类型,Can[0]也是一种类型,虽然有点奇怪:它是一个长度为零的数组。这实际上不允许作为独立类型,但编译器将其作为扩展提供。

无论如何,sizeof(Can[0])只是0。

你不应该说里面的类型malloc。相反,请使用该变量。这消除了冗余。所以,你的代码应该是:

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

for (size_t i = 0; i != 10; ++i)
{
    canArray[i] = malloc(sizeof canArray[i][0]);
    canArray[i]->AC = 0;
    printf("%zu - AC is %d\n", i, canArray[i]->AC);
}
于 2013-05-01T07:58:08.953 回答