叮叮当当参考?
Posted
技术标签:
【中文标题】叮叮当当参考?【英文标题】:clang dangling reference? 【发布时间】:2012-10-05 09:01:34 【问题描述】:我的功能是发出“悬空引用”警告,即:
int mode_pos = 0, mode;
static char *s;
char buffer[FAT_BUFFER + 1];
chan->i_mode = chan->mode;
buffer[0] = 0;
s = buffer;
mode = chan->mode;
if (!mode)
return NULL;
^^^^^^^^^^^^
与局部变量'buffer'相关的栈内存地址在返回给调用者时仍然被全局变量's'引用。这将是一个悬空参考
这严重吗?真正纠正它的最佳方法是什么?
【问题讨论】:
【参考方案1】:你似乎有设计问题,在这里。如果s
真的只在那个函数中使用并且无条件地设置为buffer
,那么拥有它static
是没有意义的。如果是这样,这个悬空引用也不是很危险,但最好清理代码以避免意外。
【讨论】:
【参考方案2】:是的,这很严重。
它会导致未定义的行为。 buffer
的生命周期仅限于函数的范围(,
),它可能/可能不会超出函数体。它有时似乎可以工作,有时可能会失败。它不能保证工作,你会期望你的程序以定义的方式工作。所以应该避免它。
您需要以这样一种方式定义buffer
,使其生命周期延长到函数体之外。有两种方法可以做到这一点:
-
你动态内存分配使用
malloc()
(调用者应该记得free()
它)或
将buffer
声明为static
本地。
【讨论】:
我继续,只是将缓冲区设为静态 :) 谢谢!以上是关于叮叮当当参考?的主要内容,如果未能解决你的问题,请参考以下文章
第一次在当当网买书,已经付款了,为啥订单状态还是显示“等待付款”?
aabb式的成语bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb