重新分配一组Structs

时间:2011-05-29 19:39:07

标签: c arrays struct realloc

我正在尝试动态地为一个结构数组重新分配内存(实际上是一个数组,每个结构包含2个结构,但为了简单起见,这里包括1个),这些结构正在从文件中读取或由用户输入。

typedef Struct
{
    char surname[21];
    char firstname[21];
    char username[21];
...
} User;

...在main()中:

int size = 0; /* stores no. of structs */
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
    printf("Cannot allocate initial memory for data\n");
    exit(1);
}
else
    size++;

然后我尝试使用函数调用在需要时增加数组:

int growArray(User user_array*, int size)
{
    User *temp;
    size++;
    temp = (User *) realloc(user_array, (size * sizeof(User));
    if(temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        exit(1);
    }
    else
        user_array = temp;
    return size;
}

不幸的是,realloc永远不会有效。两个结构每个实例只有大约200个字节,并且将初始大小设置为10可以正常工作,因此我尝试使用realloc的方式一定有问题。

系统是Win 7 64,在Core i5上运行4GB,运行Quincy(MinGW GUI)。

2 个答案:

答案 0 :(得分:6)

reallocuser_array指向的内存大小更改为指定大小,但不会按大小增加。看到你的函数被称为growArray,我认为你希望它增加size数组的大小,在这种情况下你需要:

int growArray(User **user_array, int currentSize, int numNewElems)
{
    const int totalSize = currentSize + numNewElems;
    User *temp = (User*)realloc(*user_array, (totalSize * sizeof(User)));

    if (temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        return 0;
    }
    else
    {
        *user_array = temp;
    }

    return totalSize;
}

请注意,growArray的地址为user_array,原因是如果realloc无法将现有块扩展到所需的大小,int size = 0; User* user_array = (User *) calloc(1, sizeof(User)); if(user_array == NULL) { printf("Cannot allocate initial memory for data\n"); exit(1); } /* add 10 new elements to the array */ size = growArray(&user_array, size, 10); 可能会移动内存。< / p>

使用它:

{{1}}

答案 1 :(得分:3)

您正在本地更改user_array的值。函数返回时,该值将丢失。将指针传递给user_array指针。