在C语言中,如何在另一个函数中初始化指针?

17

我需要做一件简单的事情,这在Java中我做过很多次,但是在C语言(不是C++)中却卡住了。情况如下:

int *a;

void initArray( int *arr )
{
    arr = malloc( sizeof( int )  * SIZE );
}

int main()
{
    initArray( a );
    // a is NULL here! what to do?!
    return 0;
}

我有一个“初始化”函数,它应该将给定的指针分配给一些分配的数据(不重要)。为了让这个指针被修改并且可以在代码中进一步使用(在函数调用返回后),我应该如何将一个指针传递给一个函数?

2个回答

28
你需要调整*a指针,这意味着你需要传递一个指向*a的指针。你可以这样做:
int *a;

void initArray( int **arr )
{
    *arr = malloc( sizeof( int )  * SIZE );
}

int main()
{
    initArray( &a );
    return 0;
}

3
另一种选择(我认为更好)是 int *initArray(size_t s) { return malloc(sizeof(int) * s); },然后将其用作 int *arr = initArray(SIZE); - Chris Lutz
1
Chris,我不应该这样做,因为这个示例有点不自然。在我的实际情况中,“initArray”函数会返回一个值,所以我不能使用它。但无论如何还是谢谢:) - pechenie

8

initArray函数中,你是按值传递方式给arr赋值的,所以对arr值的任何更改都不会被外部世界看到。你需要通过指针传递arr

void initArray(int** arr) {
  // perform null-check, etc.
  *arr = malloc(SIZE*sizeof(int));
}
...
initArray(&a);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接