为 2D 阵列 C "reallocating"新内存时出现分段错误



我很难为2D数组重新分配内存。每当我试图修改已经重新分配的数组时,我都会遇到分段错误。我的代码正在为数组的默认大小工作,只有当我使用grow重新分配时,它才会被卡住。你明白为什么了吗?

此外,您所知道的重新分配2D阵列的最简单、最简单的方法是什么?在这样做的时候,通常什么是好的做法?

这是代码:

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;
}

我分别得到了arr0x7fff88fbd338newarr:0x7fff88fbd348的地址。

我在这里使用它,read读取stdin并存储2D数组中的每一行。

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*/);

相关内容

  • 没有找到相关文章

最新更新