[英]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.