通过值将指针传递给c函数中的指针

时间:2015-07-21 21:50:44

标签: c function pointers

fid_table是指向fid_list指针数组的指针。

我正在尝试在单独的函数中初始化fid_tableNULL。我理解fid_table是按值复制的,但它是一个指针,所以不应该是问题。

fid_list **fid_table;
fid_table_init(fid_table);
assert(fid_table[0] == NULL);

函数fid_table_init定义如下:

void fid_table_init(fid_list **fid_table){
    fid_table = (fid_list **) malloc(HTABLE_SIZE * sizeof(fid_list *));
    for(int i = 0; i < HTABLE_SIZE; i++){
        fid_table[i] = NULL;
    }
}

有人可以详细说明为什么这个断言失败了吗?

2 个答案:

答案 0 :(得分:5)

按以下方式定义功能

void fid_table_init(fid_list ***fid_table){
    *fid_table = (fid_list **) malloc(HTABLE_SIZE * sizeof(fid_list *));
    for(int i = 0; i < HTABLE_SIZE; i++){
        ( *fid_table )[i] = NULL;
    }
}

并称之为

fid_table_init( &fid_table );

在原始函数中,指针通过值传递,该函数处理指针的副本。因此,副本的任何更改都不会影响原始指针。

考虑到函数的参数是它的局部变量。因此,在函数内部,您分配了一个内存并将其地址分配给函数的局部变量。它是分配给不是原始指针的局部变量。退出函数后,其局部变量将被销毁。原始指针不知道对其副本做了什么

答案 1 :(得分:5)

fid_table_init函数中,fid_table是一个局部变量,使用从调用者传递的值进行初始化。 malloc行更改了局部变量的值,它不会更改调用者中fid_table的值,因此调用代码永远不会看到从malloc返回的指针。

修复代码的最简单方法是从fid_table_init函数返回指针的新值,并将其分配给调用者中的fid_table

fid_list **fid_table = fid_table_init();
assert(fid_table[0] == NULL);
fid_list **fid_table_init( void )
{
    fid_list **temp = malloc(HTABLE_SIZE * sizeof(fid_list *));
    for(int i = 0; i < HTABLE_SIZE; i++){
        temp[i] = NULL;
    }
    return temp;
}