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);

每当我checkMetest2dArray调用main.

但是,如果我改为inmalloc的空间(通过取消注释上面的注释行)并将我的调用更改为:inttest2dArraymain

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

test2dArray(checkMe, 10);

内存崩溃消失了,我可以checkMe在函数调用后很好地引用。


我知道这checkMetest2dArray按价值传递的。我认为这意味着返回的地址checkMe = malloc(sizeof(int *) * 10);被复制到函数中。

我不明白为什么如果我没有内部空间int *,商店会丢失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 分配内存。所以你有一个由 10 个指针组成的数组,每个指针都指向sizeof(int)内存字节。

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 回答