为什么malloc的一种方式是错误的,而另一种方式不是?

时间:2017-02-06 21:35:20

标签: c arrays pointers

如果我有一个int数组:

int *array;

array = malloc(5 * sizeof(int));

和我上面的malloc,然后我可以访问它并为其设置值。一切都很好。

但是如果我创建那个int指针并向它传递一个函数和malloc 里面的函数,我就无法访问/设置数组的值< em>除非我将它作为指针传递给数组?

some_void_function(int *array) {
    array = malloc(5 * sizeof(int))
}

int *array;
some_void_function(array);

*(array + 3) = 5; // DOES NOT WORK

要修复它,我可以使数组accept(int ** array)作为参数并传入指针的地址(所以指向指针的指针),取消引用它,并用malloc赋值:

some_void_function(int **array) {
    *array = malloc(5 * sizeof(int))
}

int *array;
some_void_function(&array);

*(array + 3) = 5; // WORKS 

有人可以向我解释一下吗?我在两种情况下都没有做同样的事情吗?传递地址,然后只是解除引用它就像在第一个位置传入单个指针一样吗?

2 个答案:

答案 0 :(得分:2)

指针是保存地址的变量。但它们与所有其他类型的变量遵循相同的规则,这意味着它们是按值传递的。

void some_void_function(int *array) {
    array = malloc(5 * sizeof(int))
}

array位于some_void_function的本地,您对其值所做的任何更改都不会反映在复制指针中。

要修改调用代码中的变量(包括指针),您有两个选择:

  1. 通过指针,这意味着指向指针的指针:

    void some_void_function(int **array) {
      *array = malloc(5 * sizeof(int))
    }
    
  2. 返回您分配的地址并将其指定给指针:

    int* some_allocating_function() {
      return malloc(5 * sizeof(int))
    }
    //...
    int *array = some_allocating_function();
    

答案 1 :(得分:2)

那是因为c通过值传递参数

some_void_function(int *array) {
    array = malloc(5 * sizeof(int))
}

此代码只修改array的本地副本,它不会更改array的调用者副本

此代码

some_void_function(int **array) {
    *array = malloc(5 * sizeof(int))
}

传递调用者数组的地址,这允许你伸出你的函数并更改调用者数组指针