1

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

4

3 に答える 3

2

割り当ててmainいる場合、10個の整数を割り当てていません。

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

に変更します

checkMe[i] = malloc(sizeof(int) * 10);
于 2013-02-08T04:35:28.740 に答える
1
for (i = 0; i < 10; i++) {
    checkMe[i] = malloc(sizeof(int));
}

int各ループ反復で 1 のメモリのみを割り当てています。sizeof(int)したがって、それぞれがメモリのバイトを指す 10 個のポインターの配列があります。

test2dArray(checkMe, 10);

少なくとも10*sizeof(int)メモリを指す 10 個のポインターの配列に対してのみ機能します。checkMe[i] = malloc(sizeof(int)*10)上記の行を;に変更する必要があります。

于 2013-02-08T04:35:43.580 に答える
1

あなたのバグはこれの違いです:

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

この:

arr[i] = malloc(sizeof(int) * size); // size = 10
于 2013-02-08T04:35:51.390 に答える