我有一个指向结构的指针数组:
item** items = NULL;
这些是我为分配和打印数组而编写的函数:
void allocateItems(item** items, int numItems) {
items =malloc(numItems*sizeof(item*));
for (int i = 0; i < numItems; i++) {
items[i]=malloc(sizeof(item*));
items[i]->data = i + 1;
items[i]->data2 = (i + 1) % 2;
}
}
void printItems(item** items, int numItems) {
for (int i = 0; i < numItems; i++) {
printf("%d : %d\n", items[i]->data, items[i]->data2);
}
}
但是当我尝试打印那个结构数组时,我遇到了分段错误。有人能告诉我错误在哪里吗?
答案 0 :(得分:6)
这只为item*
分配足够的内存:
items[i]=malloc(sizeof(item*));
它必须为item
:
items[i]=malloc(sizeof(item));
为了使allocateItems()
所做的更改对调用方可见,则必须传递items
的地址:
allocateItems(&items, 4);
更改参数类型并且意味着items
必须在函数中取消引用:
void allocateItems(item*** items, int numItems)
{
*items = malloc(numItem * sizeof(item*));
for (int i = 0; i < numItems; i++)
{
(*items)[i] = malloc(sizeof(item));
(*items)[i]->data = i + 1;
(*items)[i]->data2 = (i + 1) % 2;
}
}
这可以通过分配item
数组而不是item*
数组来简化。这也意味着items
列表位于连续的内存块中,而不是使用多个malloc()
进行分段来分配数组中的每个元素:
void allocateItems(item** items, const int numItems)
{
*items = malloc(numItems * sizeof(item));
if (*items)
{
for (int i = 0; i < numItems; i++)
{
(*items)[i].data = i + 1;
(*items)[i].data2 = (i + 1) % 2;
}
}
}
item* items;
allocateItems(&items, 4);
if (items)
{
for (int i = 0; i < 4; i++)
printf("[%d]: (%d, %d)\n",
i,
items[i].data,
items[i].data2);
free(items);
}