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
でも:int
main
int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);
for (i = 0; i < 10; i++) {
checkMe[i] = malloc(sizeof(int));
}
test2dArray(checkMe, 10);
の呼び出しcheckMe
後に反復するたびに、メモリが失われます。test2dArray
main
しかし、代わりにinmalloc
のスペースを(上記のコメント行のコメントを外して) 呼び出しを次のように変更すると、次のようになります。int
test2dArray
main
int ** checkMe;
checkMe = malloc(sizeof(int *) * 10);
test2dArray(checkMe, 10);
メモリの破壊がなくなりcheckMe
、関数呼び出しの後で問題なく参照できるようになります。
checkMe
値渡しされていることを理解してtest2dArray
います。checkMe = malloc(sizeof(int *) * 10);
これは、返されるアドレスが関数にコピーされることを意味すると思います。
中からスペースを取らないと、格納されているint *
'sが失われる理由がわかりませんcheckMe
malloc
test2dArray