2010-05-14 27 views
6

可以说我有以下几点:这个指针初始化是否必要?

CHARLINK * _init_link(CHARLINK **link) 
{ 
    short i; 
    (*link)->cl = (CHARLINK **) calloc(NUM_CHARS, sizeof(CHARLINK *)); 
    for (i = 0; i < NUM_CHARS; i++) 
     (*link)->cl[i] = NULL; 
    return (*link); 
} 

是环路初始化每个元素为NULL必要或者他们自动释放calloc NULL?

回答

13

是的,在循环中赋值为NULL是必需的。 calloc初始化为所有位0.但空指针可能不会像那样表示。它依赖于实现。因此分配是必要的。

3

不,calloc将其缓冲区初始化为0。

+0

具体而言,它初始化为“所有位0”,这可能不是'NULL'(或0'float'值或者,对于这个问题)。 – 2010-05-14 20:24:42

7

这取决于你的系统,但在绝大多数情况下,这没关系。 calloc()会返回一个填充零的缓冲区。但是,您计算机上的空指针可能不是0的位模式。在空指针非零的机器上,您可能会遇到麻烦。

+2

依靠通常有效但不能保证工作的行为是一个坏主意。即使你永远不会遇到它,离开循环并仅仅将'calloc()'改变为'malloc()'也不会更容易,所以没有人会试图去掉循环并破坏代码在那些奇特的平台之一上? – 2010-05-14 20:35:13

+0

+1 @Chris,我就是这么做的。 – 2010-05-14 21:04:53

+0

正确,正确 – Mandrake 2010-05-14 22:53:04