【问题标题】:Why does the argument use an address of a pointer here?为什么参数在这里使用指针的地址?
【发布时间】:2017-08-16 14:21:52
【问题描述】:

我在这里找到了一个用 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 */
}

我错过了什么吗?

【问题讨论】:

  • 查看原始代码的最后一行 *sb = 0; /* Set value of pointer to zero */ 将地址传递给函数的指针设置为 NULL。告诉你什么?

标签: c pointers


【解决方案1】:

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

*sb = NULL;

改为。

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

在你的情况下,sb = 0 没有效果,因为在那之后你再也不使用sb

另外,作为freeStrings 一个参数,我认为这是一个缺陷设计。如果作者想要有双重 free() 行为,这已经很糟糕了,他们应该在结构中有一个 freeStrings 成员,然后对字符串是否由结构拥有很多控制。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多