簡體   English   中英

將malloc用於2D數組時出現分段錯誤

[英]Segmentation fault when using malloc for 2D array

我使用malloc創建一個二維數組。 當我使用printf在for循環中打印數組元素時,一切都很好。 但是當我要在main中使用printf時,這是一個Segmentation fault: 11.

您能否告訴我以下代碼的問題是什么?

#include <stdlib.h>
#include <stdio.h>

void initCache(int **cache, int s, int E){
int i, j;
/* allocate memory to cache */
cache = (int **)malloc(s * sizeof(int *)); //set 
for (i = 0; i < s; i++){
    cache[i] = (int *)malloc(E * sizeof(int)); //int

    for(j = 0; j < E; j++){
        cache[i][j]  = i + j;   
        printf("%d\n", cache[i][j]);
    }
  }
}


main()
{
    int **c;

    initCache (c, 2, 2);

    printf("%d\n", c[1][1]);  // <<<<<<<<<< here

}

由於您的緩存是2D數組,因此它是int** 要在函數中設置它,請傳遞int*** ,而不要傳遞int** 否則,對initCache內部的cache所做的更改不會影響main()c的值。

void initCache(int ***cache, int s, int E) {
    int i, j;
    /* allocate memory to cache */
    *cache = (int **)malloc(s * sizeof(int *)); //set 
    for (i = 0; i < s; i++) {
        (*cache)[i] = (int *)malloc(E * sizeof(int)); //int
        for(j = 0; j < E; j++){
            (*cache)[i][j]  = i + j;   
            printf("%d\n", (*cache)[i][j]);
        }
    }
}

現在您可以這樣稱呼它:

initCache (&c, 2, 2);

您更改了局部變量,這不會影響main中的局部變量c

如果要在函數中分配,為什么要傳遞變量? 從函數返回它。

int **c = initCache(2, 2);

您可以使用return ,也可以使用別人建議的*** 我將在這里描述return方法。

initCache正在創建和初始化合適的數組,但未返回它。 cache是指向數據的局部變量。 有兩種方法可以使此信息可供調用函數使用。 要么return它,要么傳入一個int***並使用它來記錄指針值。

我建議這樣:

int** initCache(int **cache, int s, int E){
   ....
   return cache;
}


main()
{
   int **c;
   c = initCache (2, 2);
   printf("%d\n", c[1][1]);   <<<<<<<<<< here
}

====

最后,養成檢查錯誤的習慣非常重要。 例如,如果malloc內存不足,它將返回NULL 另外,您可能會意外地發現內存量為負(如果s為負)。 因此,我會這樣做:

cache = (int **)malloc(s * sizeof(int *));
assert(cache);

如果malloc失敗,這將結束程序,並告訴您哪一行失敗了。 有些人(包括我在內!)會assert喜歡這樣使用assert 但是我們都同意,這比沒有任何錯誤檢查要好!

您可能需要#include <assert.h>才能完成此工作。

暫無
暫無

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

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