指向结构打印的指针数组

时间:2013-04-09 11:00:01

标签: c pointers struct segmentation-fault

我有一个指向结构的指针数组:

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

但是当我尝试打印那个结构数组时,我遇到了分段错误。有人能告诉我错误在哪里吗?

1 个答案:

答案 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);
}