0

我的功能是发出“悬空参考”警告,即:

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' 引用。这将是一个悬空的参考

这严重吗?真正纠正它的最佳方法是什么?

4

2 回答 2

3

你似乎有设计问题,在这里。如果s真的只在那个函数内部使用并且无条件地设置为buffer,那么拥有它根本没有意义static。如果是这样,这个悬空引用也不是一个非常危险的引用,但最好清理你的代码以避免意外。

于 2012-10-05T09:07:27.550 回答
1

是的,这很严重。
它会导致未定义的行为。的生命周期buffer仅限于函数的范围({}),它可能/可能不会超出函数体。它有时似乎可以工作,有时可能会失败。它不能保证工作,你会期望你的程序以定义的方式工作。所以应该避免它。

您需要以buffer这种方式进行定义,以使其生命周期超出函数体。有两种方法可以做到这一点:

  1. 您使用动态内存分配malloc()(调用者应该记住free()它)或
  2. 声明bufferstatic本地。
于 2012-10-05T09:04:34.673 回答