Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当双指针传递给函数时,它会发生什么情况_C_Stack_Double Pointer - Fatal编程技术网

C 当双指针传递给函数时,它会发生什么情况

C 当双指针传递给函数时,它会发生什么情况,c,stack,double-pointer,C,Stack,Double Pointer,我在理解c中带指针的传递值机制如何工作时遇到了一些困难。这是我做作的例子 在mymain函数中,Imalloc指向int数组的指针: int ** checkMe; checkMe = malloc(sizeof(int *) * 10); 据我所知,该操作将一个边设置为一个包含10个内存块的块,每个块的大小足以容纳指向int指针的指针。我在这个由10个块组成的块的开始处收到指针 我有另一个函数,它将双指针作为参数: void test2dArray(int ** arr, int size

我在理解c中带指针的传递值机制如何工作时遇到了一些困难。这是我做作的例子


在my
main
函数中,I
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;
        }
    }
}
每当我在
test2dArray
调用
main
之后迭代
checkMe
时,就会出现内存崩溃

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

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

test2dArray(checkMe, 10);
内存崩溃消失了,我可以在函数调用后正常引用
checkMe


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


我不明白为什么
int*
checkMe
存储的
int*
如果我不
malloc
test2dArray

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

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

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

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

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

checkMe[i] = malloc(sizeof(int) * 10);
仅适用于指向至少
10*sizeof(int)
内存的10个指针数组。您应该将上面的行更改为
checkMe[i]=malloc(sizeof(int)*10)


仅适用于指向至少
10*sizeof(int)
内存的10个指针数组。您应该将上面的行更改为
checkMe[i]=malloc(sizeof(int)*10)

您的bug就是这两者之间的区别:

checkMe[i] = malloc(sizeof(int));
这是:

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

您的错误是以下两者之间的区别:

checkMe[i] = malloc(sizeof(int));
这是:

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

你所说的“撞击”是什么意思?@Potatoswatter-这是“粉碎”堆栈的新术语吗?可悲的是,我在我的项目和我上面设计的示例中都错误地做到了这一点。谢谢大家让我直截了当地了解这个可笑的简单错误,我把它变成了一个更大的东西……你说的“碰撞”是什么意思?@potatosatter-这是“粉碎”堆栈的新术语吗?可悲的是,我在我的项目和我上面设计的示例中都做得不正确。谢谢你们让我明白了这个可笑的简单错误,我把它变成了更大的东西。。。