这是我的程序
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它会给出消息/警告&#34;读取大小为4和#34的无效。
欢迎任何帮助解决警告
答案 0 :(得分:4)
n
是fun1()
中的局部变量,退出函数后不再有效。
答案 1 :(得分:1)
仅当函数处于活动状态时,才存在局部变量。你正在返回pf
,这是一个指向局部变量的指针。退出函数后,分配给变量的内存将被释放,这会导致未定义的行为。
答案 2 :(得分:1)
将我的评论转化为答案:在该函数返回后,您正在从函数外部引用局部变量。这意味着即使在运行程序时这似乎也可以工作,因为堆栈在赋值之间保持不变。如果在赋值和打印之间调用其他函数,则很可能会失败。我说“最有可能”,因为你所做的是未定义的行为,因此无法预测。
要修复这种特殊情况:在fun1内的堆上为n分配内存,并返回指向所述内存的指针而不是现在的内存。
答案 3 :(得分:0)
您正在返回本地变量的地址,而valgrind正在警告您。在main中访问此指针将调用未定义的行为。