繁体   English   中英

指向结构打印的指针数组

[英]Array of pointer to structs printing

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

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

但是,当我尝试打印该结构数组时,出现了分段错误。 有人可以告诉我错误在哪里吗?

这只会为一个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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM