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