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

标签 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 */
}

我在这里错过了什么吗?

最佳答案

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

*sb = NULL;

相反。

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

在您的情况下,sb = 0 没有任何效果,因为在那之后您从未使用过 sb

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

关于c - 为什么参数在这里使用指针的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45716151/

相关文章:

C代码读取包含两列(数字)的文件并用数组打印

c - Swift 中释放 C-malloc() 内存?

c++ - 如何检查std::unique_ptr是否为空(如果它位于std::vector中)?

c++ - `Array[i]` 与 `Array+i`

pointers - 将结构作为参数传递给函数进行修改的内存/处理器效率最高的方法是什么?

C++ 提取指针类型

c - 读取字符时 c 中的 scanf 错误

C头文件依赖

c - 如何拦截 SSH stdin 和 stdout? (不是密码)

c++ - 为什么 turbo c wraparound signed integer overflow 每次虽然有符号整数溢出是未定义的?