簡體   English   中英

為二維數組C“重新分配”新內存時出現分段錯誤

[英]Segmentation fault when “reallocating” new memory for 2D array C

我很難為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;
}

我得到的地址是arr 0x7fff88fbd338newarr0x7fff88fbd348

我在這里使用它, 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*/);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM