从函数重新分配struct中的动态数组

时间:2016-07-29 12:52:05

标签: c arrays struct

我已经阅读了与StackOverflow上的这个主题有些相关的其他问题(即(1)(2)),但它们没有解决我在结构中以某种方式指定的成员数组的问题我可以逻辑地遵循。

在C中,我指定一个双指针作为我的struct的成员。这个双指针用作二维动态数组 - 严格来说,它是一个指向内存中字符指针数组的指针数组。结构的其余成员用于跟踪此2-D动态数组的当前和分配大小。

typedef struct CharArrayXY
{
    char **array; // A look-up table pointing to a 2-D arrangement of values stored in memory
    size_t used_x; // Number of arrays occupying 2-D array
    size_t *used_y; // Number of elements occupying each array
    size_t size_x; // Number of spaces allocated for arrays in 2-D array
    size_t *size_y; // Number of spaces allocated for elements in each array
} CharArrayXY;

我在一个单独的函数中初始化了几个malloc()调用的结构的所有成员,没有任何问题。这是该功能的重要部分:

a->array = malloc(sizeof(*a->array) * x_dim);
// Check if it's NULL...
for (x_ind = 0; x_ind < x_dim; x_ind++)
{
    a->array[x_ind] = malloc(sizeof(char) * y_dim);
}

a->size_x = x_dim;

a->size_y = malloc(sizeof(size_t) * x_dim);
// Check if it's NULL...
for (x_ind = 0; x_ind < x_dim; x_ind++)
{
    a->size_y[x_ind] = y_dim;
}

a->used_x = 0;

a->used_y = malloc(sizeof(size_t) * x_dim);
// Check if it's NULL...
for (x_ind = 0; x_ind < x_dim; x_ind++)
{
    a->used_y[x_ind] = 0;
}

我通过realloc()调用来调整struct的双指针成员。

void add_char_xy (CharArrayXY *a, char element, size_t x_ind)
{
    if (a->used_x == a->size_x)
    {
        printf("Reallocating for more space...\n");
        a->size_x += 2;
        temp_ptr = realloc(a->array, sizeof(*a->array) * a->size_x);
        if (temp_ptr == NULL)
        {
            fprintf(stderr, "realloc() call failed.\n");
            return;
        }
        a->array = temp_ptr;
    }

    if (a->used_y[x_ind] == a->size_y[x_ind])
    {
        a->size_y[x_ind] += 10;
        a->array[x_ind] = realloc(a->array[x_ind], sizeof(*a->array[x_ind]) * a->size_y[x_ind]);
    }

    printf("Storing '%c' in CharArrayXY[%zu][%zu].\n", element, x_ind, a->used_y[x_ind]);
    a->array[x_ind][a->used_y[x_ind]] = element;
    a->used_y[x_ind]++;
}

realloc()调用不会产生NULL指针,这表明重新分配内存没有问题。我已将问题的根源追溯到结构的used_y成员,因为它已更新为56而不是0。我的理解是used_y成员被重新分配到内存中我没有分配给它的新空间,所以当我尝试访问它时它会返回一个垃圾值。

... Storing many characters in the array
Storing 'b' in CharArrayXY[4][0]. <-- Array is being populated fine (hasn't been reallocated yet, still filling initialized array)
Storing 'l' in CharArrayXY[4][1].
Storing 'd' in CharArrayXY[4][2].
Storing 'b' in CharArrayXY[4][3].
Storing 'e' in CharArrayXY[4][4].
Storing 'f' in CharArrayXY[4][5].
Storing 's' in CharArrayXY[4][6].
Storing 'a' in CharArrayXY[4][7].
Storing 'r' in CharArrayXY[4][8].
Storing 'c' in CharArrayXY[4][9].
Reallocating for more space...
Storing 'b' in CharArrayXY[5][65]. <-- Right after the realloc() call
Segmentation fault (core dumped)

为什么在成功重新分配结构的a->used_y[x_ind]成员后,array的值似乎在内存中填充了垃圾值?

1 个答案:

答案 0 :(得分:4)

经过一些编辑和评论:)问题是:

每次更改realloc的大小(增加)时,您必须a->used_yarray并且所有变量都与array的大小相关。

确保初始化a->used_y的新分配内存。