4

这是我的程序

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

非常欢迎任何帮助解决警告

4

4 回答 4

4

n是一个局部变量,fun1()在函数退出后不再有效。

于 2013-11-05T09:39:16.873 回答
1

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

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

于 2013-11-05T09:45:00.973 回答
1

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

于 2013-11-05T09:42:37.203 回答
0

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

于 2013-11-05T09:42:29.403 回答