这是我的程序
int* fun1(void)
{
int n=9;
int *pf=&n;
cout<<*pf<<endl;
return pf;
}
int main(int argc, char *argv[])
{
int *p=fun1();
cout<<*p;
return 0;
}
程序的编译和运行不会产生任何问题,但使用 valgrind 它会给出消息/警告"大小为 4 的无效读取"。
非常欢迎任何解决警告的帮助
n
是 fun1()
中的局部变量,在函数退出后不再有效。
将我的评论变成答案:在函数返回后,您正在从函数外部引用局部变量。这意味着,即使在运行程序时,这似乎也可以工作,因为堆栈在分配之间保持不变。如果在赋值和打印之间调用其他函数,则很可能会失败。我说"最有可能"是因为你正在做的事情是未定义的行为,因此无法预测。
要修复此特殊情况:在 fun1 中的堆上为 n 分配内存,并返回指向所述内存的指针,而不是您现在拥有的内存。
局部变量仅在函数处于活动状态时才存在。您返回的是指向局部变量的指针pf
。一旦退出函数,分配给变量的内存就会被解除分配,这会导致未定义的行为。
您返回的是一个局部变量的地址,而 valgrind 正在警告您。在 main 中访问此指针将调用未定义的行为。