叮叮当当参考?

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 本地。

【讨论】:

我继续,只是将缓冲区设为静态 :) 谢谢!

以上是关于叮叮当当参考?的主要内容,如果未能解决你的问题,请参考以下文章

第一次在当当网买书,已经付款了,为啥订单状态还是显示“等待付款”?

ASmack 上的叮当声 - XMPP

Scrapy爬虫爬取当当网图书畅销榜

prometheus通过webhook推送告警至钉钉

aabb式的成语bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

史上最详细的爬虫教程,Python采集全网最受欢迎的 500 本书!