gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com