簡體   English   中英

將雙指針傳遞給函數時會發生什么

[英]what happens to a double pointer when it is passed to a function

我在理解通過值機制如何在帶有指針的c中工作時遇到了一些麻煩。 這是我做作的例子......


在我的main函數中,我malloc指向int數組的指針:

int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);

據我所知,這個操作設置了一個包含10塊內存的塊,每塊大到足以容納指向int指針的指針。 我在這塊10塊的開頭收到了指針。

我有另一個函數,將雙指針作為參數:

void test2dArray(int ** arr, int size) {
    int i, j;

    for (i = 0; i < size; i++) {
        // arr[i] = malloc(sizeof(int) * size);
        for (j = 0; j < size; j++) {
            arr[i][j] = i * j;
        }
    }
}

每當我按原樣離開注釋部分,並嘗試mallocmainint空間,如下所示:

int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);

for (i = 0; i < 10; i++) {
    checkMe[i] = malloc(sizeof(int));
}

test2dArray(checkMe, 10);

每當我在maintest2dArray調用之后迭代checkMe時,我都會遇到內存test2dArray

但是,如果我在test2dArrayint替換了malloc (通過取消注釋上面的注釋行)並將我的調用從main更改為:

int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);

test2dArray(checkMe, 10);

內存崩潰消失了,我可以在函數調用后很好地引用checkMe


我知道checkMe是按值傳遞給test2dArray的。 我認為這意味着checkMe = malloc(sizeof(int *) * 10);返回的地址checkMe = malloc(sizeof(int *) * 10); 被復制到函數中。

我不明白為什么如果我不在test2dArray malloc的話,那個checkMe商店的int *會丟失

當您在main中分配時,您沒有分配10個整數,

checkMe[i] = malloc(sizeof(int));

改為

checkMe[i] = malloc(sizeof(int) * 10);
for (i = 0; i < 10; i++) {
    checkMe[i] = malloc(sizeof(int));
}

您只在每個循環迭代中為1 int分配內存。 所以你有一個包含10個指針的數組,每個指針都指向sizeof(int)字節的內存。

test2dArray(checkMe, 10);

僅適用於指向至少10*sizeof(int)內存的10個指針的數組。 您應該將上面的行更改為checkMe[i] = malloc(sizeof(int)*10) ;

你的錯誤是這之間的區別:

checkMe[i] = malloc(sizeof(int));

和這個:

arr[i] = malloc(sizeof(int) * size); // size = 10

暫無
暫無

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

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