在struct from函数中重新分配动态数组
我已经阅读了与StackOverflow(即and)主题相关的其他问题,但它们并没有解决我关于在结构中指定的成员数组的问题,我可以逻辑地遵循这种方式 在C中,我指定一个双指针作为结构的成员。此双指针用作二维动态数组-严格来说,它是指向内存中字符的指针数组的指针数组。结构的其余成员用于跟踪此二维动态数组的当前大小和分配大小在struct from函数中重新分配动态数组,c,arrays,struct,C,Arrays,Struct,我已经阅读了与StackOverflow(即and)主题相关的其他问题,但它们并没有解决我关于在结构中指定的成员数组的问题,我可以逻辑地遵循这种方式 在C中,我指定一个双指针作为结构的成员。此双指针用作二维动态数组-严格来说,它是指向内存中字符的指针数组的指针数组。结构的其余成员用于跟踪此二维动态数组的当前大小和分配大小 typedef struct CharArrayXY { char **array; // A look-up table pointing to a 2-D arra
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()
不会导致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)
。。。在数组中存储许多字符
正在CharArrayXY[4][0]中存储“b” 经过一些编辑和评论:)问题是:
每次更改array
的大小(增加)时,您必须realloc
atea->used\y
以及与array
大小相关的所有变量
还要确保初始化a->used\y
的新分配内存 经过一些编辑和评论:)问题是:
每次更改array
的大小(增加)时,您必须realloc
atea->used\y
以及与array
大小相关的所有变量
还要确保初始化a->used\y
的新分配内存 旁注:到目前为止,您显示的代码似乎没有问题。问题可能在别处。请用a更新您的问题。您确定realloc
没有失败吗?始终检查函数返回值。尽管您声称完全理解,但诸如“成员数组是通过它的值而不是它的地址传递到realloc()
的”之类的注释表明您并不完全理解。没有成员数组,只有一个成员指针。如果您将该指针传递给任何函数,那么是的,它是按值传递的,因为C没有其他参数传递约定,但这似乎与我从您的代码中推断的期望一致。a->used_y
未在发布的代码中分配/初始化。。。。。所以a->used\u y[x\u ind]
是UB。这是您的真实代码吗?旁注:您目前显示的代码似乎没有问题。问题可能在别处。请用a更新您的问题。您确定realloc
没有失败吗?始终检查函数返回值。尽管您声称完全理解,但诸如“成员数组是通过它的值而不是它的地址传递到realloc()
的”之类的注释表明您并不完全理解。没有成员数组,只有一个成员指针。如果您将该指针传递给任何函数,那么是的,它是按值传递的,因为C没有其他参数传递约定,但这似乎与我从您的代码中推断的期望一致。a->used_y
未在发布的代码中分配/初始化。。。。。所以a->used\u y[x\u ind]
是UB。这是你的真实密码吗?再次感谢你,@LPs。我会确保编辑我的问题的格式,以便更容易确定这是问题所在,以防另一个so用户想做同样的事情并出现类似错误。再次感谢,@LPs。我将确保编辑我的问题的格式,以便更容易地确定这是问题所在,以防另一个so用户想做同样的事情,并出现类似的错误。
... 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)