【问题标题】:what happens to a double pointer when it is passed to a function将双指针传递给函数时会发生什么
【发布时间】:2013-02-08 04:28:57
【问题描述】:

我在理解 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;
        }
    }
}

每当我保留评论部分时,尝试mallocmain 中的int 空间,如下所示:

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

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

test2dArray(checkMe, 10);

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

但是如果我改为malloctest2dArray 中的int 空间(通过取消注释上面的注释行)并将我的呼叫从main 更改为:

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

test2dArray(checkMe, 10);

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


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

我不明白为什么checkMe 存储的int * 会丢失,如果我不使用malloc test2dArray 内的空间

【问题讨论】:

  • 你所说的“破坏”是什么意思?
  • @Potatoswatter - 这是“粉碎”堆栈的新术语吗?
  • 可悲的是,我在我的项目和上面的人为示例中都错误地执行了此操作。谢谢大家让我直截了当地解决这个可笑的简单错误,我正在制作更大的东西......

标签: c stack double-pointer


【解决方案1】:

当您在main 中分配时,您分配的不是 10 个整数,

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

改成

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

【讨论】:

    【解决方案2】:
    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);

    【讨论】:

      【解决方案3】:

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

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

      还有这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 2011-05-19
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多