Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在struct from函数中重新分配动态数组_C_Arrays_Struct - Fatal编程技术网

在struct from函数中重新分配动态数组

在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

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

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

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
ate
a->used\y
以及与
array
大小相关的所有变量


还要确保初始化
a->used\y
的新分配内存

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

每次更改
array
的大小(增加)时,您必须
realloc
ate
a->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)