gpt4 book ai didi

c - "reallocating"二维数组 C 的新内存时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:26 25 4
gpt4 key购买 nike

我很难为我的二维数组重新分配内存。每当我在那之后尝试修改已经重新分配的数组时,我都会遇到段错误。我的代码适用于数组的默认大小,只有当我使用 grow 重新分配时,它才会卡住。你知道为什么吗?

此外,您所知道的重新分配二维数组的最原子和最短的方法是什么?这样做通常有什么好的做法?

代码如下:

void grow(int **arr, int size_r, int size_c, int newsize_r, int newsize_c)
{
int **newarr = (int **)malloc((size_t)newsize_r * sizeof(int *));

for (int i = 0; i < newsize_r; ++i) {
newarr[i] = (int *)malloc((size_t)newsize_c * sizeof(int));
if (i < size_r) {
memcpy(newarr[i], arr[i], (size_t) size_c * sizeof(int));
free(arr[i]);
}
}
free(arr);
arr = newarr;
}

我得到 arr 0x7fff88fbd338newarr 的地址: 0x7fff88fbd348 分别。

我在这里使用它,read 读取标准输入并将每一行存储在二维数组中。

int read(int **s, int count, int size, int len) {
int c, i = 0, j;
int temp = size; //1d
int temp2 = len; //2d

for (j = 0; j < temp; j++) {
s[j][len - 1] = -1; /* sentinel */
}

while ((c = getchar()) != EOF) {
if (count == temp) {
/* realloc 1D */
grow(s, temp, temp2, 2 * temp, temp2);
temp = 2 * temp;
if (!s) { /*check*/ }
for (j = count + 1; j < temp; j++) {
/* first here segmentation fault */
s[j][temp2 - 1] = -1;
}
}
if (s[count][i] == -1) {
/* realloc 2D */
grow(s, temp, temp2, temp, 2 * temp2);
temp2 = 2 * temp2;
for (j = count + 1; j < temp; j++)
s[j][temp2 - 1] = -1;
if (!s[count]) { /*check*/ }
}
/* more code, irrelevant here */
}
}

也可以使用哨兵 -1 吗?如果不是,为什么?

此外,如果您对样式、格式等有一些其他的一般性评论,我将很高兴看到它们。

最佳答案

您应该在grow 函数中通过引用传递arr。当前,您正在函数末尾修改局部变量。这个赋值在你的函数之外是看不到的,导致那里的代码仍然使用旧指针。您释放了函数中此指针指向的内存,这导致了您的未定义行为。您可以通过引用传递数组(指向它的另一个指针)轻松解决此问题:

void grow(int ***arr, int size_r, int size_c, int newsize_r, int newsize_c)
{
int **newarr = (int **)malloc((size_t)newsize_r * sizeof(int *));
for (int i = 0; i < newsize_r; ++i) {
newarr[i] = (int *)malloc((size_t)newsize_c * sizeof(int));
if (i < size_r) {
memcpy(newarr[i], (*arr)[i], (size_t) size_c * sizeof(int));
free((*arr)[i]);
}
}
free(*arr);
*arr = newarr;
}

然后在您的代码中,将数组的地址传递给函数:

grow(&s, /*Other parameters*/);

关于c - "reallocating"二维数组 C 的新内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34384952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com