将双指针传递给函数时会发生什么

时间:2013-02-08 04:28:57

标签: c stack double-pointer

我在理解带有指针的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的{​​{1}}空格,如下所示:

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

for (i = 0; i < 10; i++) {
    checkMe[i] = malloc(sizeof(int));
}

test2dArray(checkMe, 10);

checkMe test2dArray之后main调用malloc时,我会遇到内存崩溃。

但是如果我int代替test2dArray main的空间(通过取消注释上面的注释行)并从{{1}更改我的通话对此:

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

test2dArray(checkMe, 10);

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


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

如果int *

内没有checkMe空格,我不明白为什么malloc存储test2dArray存储会丢失

3 个答案:

答案 0 :(得分:2)

当你在main中分配时,你没有分配10个整数,

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

将其更改为

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你的错误就是这个:

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

和此:

arr[i] = malloc(sizeof(int) * size); // size = 10