![](/img/trans.png)
[英]what happens when a pointer is passed as a pointer to a pointer inside another function?
[英]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;
}
}
}
每當我按原樣離開注釋部分,並嘗試malloc
為main
的int
空間,如下所示:
int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);
for (i = 0; i < 10; i++) {
checkMe[i] = malloc(sizeof(int));
}
test2dArray(checkMe, 10);
每當我在main
的test2dArray
調用之后迭代checkMe
時,我都會遇到內存test2dArray
。
但是,如果我在test2dArray
為int
替換了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.