C中包含结构动态数组的结构的Realloc

C中包含结构动态数组的结构的Realloc,c,dynamic,realloc,C,Dynamic,Realloc,重新分配项目列表的问题。我试图将项目添加到testList structs项目中,但在尝试添加或打印单个ListItems的值时,我遇到内存地址错误。任何帮助都将不胜感激 struct ListItems { int id; int name; }; struct testList { struct ListItems** items; int count; int size; }; struct Test { struct testList*

重新分配项目列表的问题。我试图将项目添加到testList structs项目中,但在尝试添加或打印单个ListItems的值时,我遇到内存地址错误。任何帮助都将不胜感激

struct ListItems
{
    int id;
    int name;
};

struct testList
{
    struct ListItems** items;
    int count;
    int size;
};

struct Test
{
    struct testList* list;
};

void printArray(struct testList* list)
{
    for (int i = 0; i < list->count; i++)
    {
        printf("id=%i, name= %i \n", list->items[i]->id, list->items[i]->name);
        fflush(stdout);
    }
    printf("printing accomplished \n");
    fflush(stdout);
}

void growArray(struct testList* list, struct ListItems* item)
{
    int size = list->size;
    list->items[list->count++] = item;
    struct ListItems** user_array = list->items;
    //printf("array count %i, array size %i \n", list->count, size);
    if (list->size == list->count)
    {
        struct ListItems* temp = realloc(*user_array, (size * 2) * sizeof (struct ListItems));
        if (temp == NULL)
        {
            printf("it's all falling apart! \n");
        }
        else
        {
            *user_array = temp;
            list->size = size * 2;
        }
    }
}

/*
 *
 */
int main(int argc, char** argv)
{

    struct Test* test = (struct Test*) malloc(sizeof (struct Test));
    test->list = (struct testList*) malloc(sizeof (struct testList));
    test->list->count = 0;
    test->list->size = 1;
    test->list->items = (struct ListItems**) malloc(sizeof (struct ListItems*));

    for (int i = 0; i < 32; i++)
    {
        struct ListItems* item = (struct ListItems*) malloc(sizeof (struct ListItems));
        item->id = i;
        item->name = i;
        growArray(test->list, item);
    }
    printArray(test->list);
    for (int j = 0; j < sizeof (test->list->items); j++)
    {
        free(test->list->items[j]);
    }
    free(test->list->items);
    free(test->list);
    free(test);
}
结构列表项
{
int-id;
int名称;
};
结构测试列表
{
结构列表项**项;
整数计数;
整数大小;
};
结构测试
{
结构测试列表*列表;
};
void printary(结构测试列表*列表)
{
对于(int i=0;icount;i++)
{
printf(“id=%i,name=%i\n”,list->items[i]->id,list->items[i]->name);
fflush(stdout);
}
printf(“打印完成\n”);
fflush(stdout);
}
void数组(结构测试列表*列表,结构列表项*项目)
{
int size=列表->大小;
列表->项目[列表->计数+]=项目;
结构列表项**用户\数组=列表->项;
//printf(“数组计数%i,数组大小%i\n”,列表->计数,大小);
如果(列表->大小==列表->计数)
{
结构ListItems*temp=realloc(*user_数组,(大小*2)*sizeof(结构ListItems));
if(temp==NULL)
{
printf(“一切都崩溃了!\n”);
}
其他的
{
*用户_数组=temp;
列表->大小=大小*2;
}
}
}
/*
*
*/
int main(int argc,字符**argv)
{
结构测试*测试=(结构测试*)malloc(sizeof(结构测试));
测试->列表=(结构测试列表*)malloc(sizeof(结构测试列表));
测试->列表->计数=0;
测试->列表->大小=1;
测试->列表->项目=(结构列表项目**)malloc(sizeof(结构列表项目*);
对于(int i=0;i<32;i++)
{
结构ListItems*项=(结构ListItems*)malloc(sizeof(结构ListItems));
项目->id=i;
项目->名称=i;
数组(测试->列表,项目);
}
打印阵列(测试->列表);
对于(int j=0;j列表->项目);j++)
{
免费(测试->列表->项目[j]);
}
免费(测试->列表->项目);
免费(测试->列表);
免费(测试);
}
您的
growtarray()
需要更新
列表->项目。在当前代码中,它将永远只指向1个元素大小的区域

编辑:

您的
realloc()
sizeof(struct ListItems))
分配,但指针包含指针,而不是元素

我会写:

void growArray(struct testList* list, struct ListItems* item)
{
        if (list->size <= list->count) {
              size_t new_size = 2 * list->size;
              struct ListItems** temp = realloc(list->items, new_size * sizeof temp[0]);
              assert(temp);

              list->size = new_size;
              list->items = temp;
        }

        list->items[list->count] = item;
        ++list->count;
}

没有意义;您可能想
jlist->count
问题始于
struct testList
的声明。指向
项数组的指针
应该只有一个
*

struct testList
{
    struct ListItems* items;   // Changed from pointer-to-pointer
    int count;
    int size;
};

这将强制代码中的其他一些更改。

不要强制转换malloc的返回。您有什么样的错误?。
测试->列表->项[0]
的区域尚未保留。您可能需要尝试某种malloc调试工具或包。您似乎正在释放尚未分配的内存,这样的错误可能很难找到。发生的主要问题是在printArray期间。数组中的某些值不正确。例如:id=0,name=0,然后id=66656,name=6
struct testList
{
    struct ListItems* items;   // Changed from pointer-to-pointer
    int count;
    int size;
};