我不是 C 程序员,所以我对 C 字符串不是很熟悉,但现在我必须使用 C 库,所以这里是我的代码的缩短版本来演示我的问题:
char** ReadLineImpl::my_completion () {
char* matches[1];
matches[0] = "add";
return matches;
}
我收到此警告:
警告 - 返回与局部变量“匹配”相关的堆栈内存地址
而且我的程序似乎无法正常工作(可能是因为上面提到的警告)。
警告意味着什么?它会引起任何问题吗?
原文由 khajvah 发布,翻译遵循 CC BY-SA 4.0 许可协议
变量
char* matches[1];
在栈上声明,当当前块超出范围时会自动释放。这意味着当您返回
matches
时,为matches
保留的内存将被释放,并且您的指针将指向您不想要的东西。您可以通过多种方式解决此问题,其中一些是:
Declare
matches[1]
asstatic
:static char* matches[1];
- this will allocate space formatches
in the static space and not on the stack (this may bite如果您使用不当,因为my_completion
函数的所有实例都将共享相同的matches
变量)。在调用函数中分配空间,并将其传递给
my_completion
函数:my_completion(matches)
:malloc
,calloc
和朋友)并将所有权传递给调用函数,调用函数必须在不需要时释放这个空间更多(使用free
)。