我声明并尝试初始化一个struct指针数组。它编译时没有错误,但是这个循环总是在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);
}
}
答案 0 :(得分:3)
分配内存时遇到一些问题。 您想为Can结构的10个指针分配空间。但你做错了。
Can **canArray= malloc(10 * sizeof(Can[0]));
这样做:
Can **canArray= malloc(10 * sizeof(Can *));
答案 1 :(得分:1)
这里需要为Can结构的10个指针分配空间。 为此,您需要编写
可以** canArray = malloc(10 * sizeof(Can *));
而不是Can **canArray= malloc(10 * sizeof(Can[0]));
答案 2 :(得分: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);
}