2015-07-21 215 views
3

fid_table是指向数组指针fid_list的指针。将值指针传递给c函数中的指针值

我想在一个单独的函数中初始化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; 
    } 
} 

能有人为什么这个断言失败详细点吗?

+0

是,C或C++?在C中,你不应该使用C++来投射'voiud *'。请选择一种语言。 – Olaf

+0

@Olaf:这是C – Keeto

+0

好的,我不会问为什么你添加了C++标签。所以:标准警告:不要施放'void *'。 – Olaf

回答

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); 

在指针由值,函数涉及指针的副本通过了原有的功能。因此,副本的任何更改都不会影响原始指针。

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

+0

这看起来有点可怕(并不意味着它是错的!)。 Tri星功能。 – Olaf

+0

@Olaf设想它就像一颗三星级的干邑。:) –

+1

恭喜:您已解锁[thee star programmer](http://c2.com/cgi/wiki?ThreeStarProgrammer)徽章! – bolov

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; 
} 
+0

感谢您的解释! – Keeto

+0

很高兴帮助,快乐的编码! – user3386109