繁体   English   中英

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

[英]what happens to a double pointer when it is passed to a function

我在理解通过值机制如何在带有指针的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;
        }
    }
}

每当我按原样离开注释部分,并尝试mallocmainint空间,如下所示:

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

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

test2dArray(checkMe, 10);

每当我在maintest2dArray调用之后迭代checkMe时,我都会遇到内存test2dArray

但是,如果我在test2dArrayint替换了malloc (通过取消注释上面的注释行)并将我的调用从main更改为:

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

test2dArray(checkMe, 10);

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


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

我不明白为什么如果我不在test2dArray malloc的话,那个checkMe商店的int *会丢失

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

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

改为

checkMe[i] = malloc(sizeof(int) * 10);
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) ;

你的错误是这之间的区别:

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

和这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM