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