为什么参数在这里使用指针的地址?

时间:2017-08-16 14:21:53

标签: c pointers

我在这里找到了一个用C实现的字符串缓冲区(https://sites.google.com/site/rickcreamer/Home/cc/c-implementation-of-stringbuffer-functionality)。有一个名为 dispose()的函数,其中一个参数是指针的地址:

void dispose( SB **sb, int freeStrings ) {
    if ( !sb || !*sb || !(*sb)->ptrList )
        return; /* TODO: Decide if should abort here or take other action */
    if ( freeStrings ) {
        for ( int i = 0; i < (*sb)->count; ++i )
            free( (*sb)->ptrList[ i ] );
    }
    free( (*sb)->ptrList );
    free( *sb );
    *sb = 0; /* Set value of pointer to zero */
}

我无法理解为什么它的第一个参数是指针的地址,而不是指针。我将函数转换为:

void dispose( SB *sb, int freeStrings ) {
    if ( !sb || !sb->ptrList )
        return; /* TODO: Decide if should abort here or take other action */
    if ( freeStrings ) {
        for ( int i = 0; i < sb->count; ++i )
            free( sb->ptrList[ i ] );
    }
    free( sb->ptrList );
    free( sb );
    sb = 0; /* Set value of pointer to zero */
}

我在这里想念一下吗?

3 个答案:

答案 0 :(得分:2)

因为这可以防止悬空指针。虽然它应该是

*sb = NULL;

代替。

这样,在调用dispose(&sb)之后,您可以在解除引用之前检查是否sb == NULL,并防止取消引用已释放的指针。

在您的情况下,sb = 0无效,因为您之后从不使用sb

另外,作为freeStrings参与者,我认为这是一个缺陷设计。如果作者想要具有已经很糟糕的双free()行为,那么他们应该在结构中有一个freeStrings成员,然后可以很好地控制字符串是否归结构所有或不。

答案 1 :(得分:0)

在您的示例中,sb = 0; /* Set value of pointer to zero */实际上将 local 变量sb的值设置为零。这就是原因。

答案 2 :(得分:0)

指针是变量类型,就像int, float等一样......所以,如果要在函数中更改它的值,则必须将引用作为参数传递给它。这就是为什么您将**sb作为参数而不是*sb