valgrind错误“无效读取大小4”

时间:2013-11-05 09:36:20

标签: c++ valgrind

这是我的程序

 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的无效。

欢迎任何帮助解决警告

4 个答案:

答案 0 :(得分:4)

nfun1()中的局部变量,退出函数后不再有效。

答案 1 :(得分:1)

仅当函数处于活动状态时,才存在局部变量。你正在返回pf,这是一个指向局部变量的指针。退出函数后,分配给变量的内存将被释放,这会导致未定义的行为

答案 2 :(得分:1)

将我的评论转化为答案:在该函数返回后,您正在从函数外部引用局部变量。这意味着即使在运行程序时这似乎也可以工作,因为堆栈在赋值之间保持不变。如果在赋值和打印之间调用其他函数,则很可能会失败。我说“最有可能”,因为你所做的是未定义的行为,因此无法预测。

要修复这种特殊情况:在fun1内的堆上为n分配内存,并返回指向所述内存的指针而不是现在的内存。

答案 3 :(得分:0)

您正在返回本地变量的地址,而valgrind正在警告您。在main中访问此指针将调用未定义的行为。