fid_table
是指向fid_list
指针数组的指针。
我正在尝试在单独的函数中初始化fid_table
到NULL
。我理解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;
}
}
有人可以详细说明为什么这个断言失败了吗?
答案 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;
}