我在这里找到了一个用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 */
}
我在这里想念一下吗?
答案 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
。