首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >valgrind错误“读取大小4无效”

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

Stack Overflow用户
提问于 2013-11-05 17:36:20
回答 4查看 26.8K关注 0票数 4

这是我的程序

代码语言:javascript
运行
复制
 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,它会给出消息/警告"Invalid read of size 4“。

欢迎提供任何帮助来解决此警告问题

EN

回答 4

Stack Overflow用户

发布于 2013-11-05 17:39:17

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

票数 4
EN

Stack Overflow用户

发布于 2013-11-05 17:42:37

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-05 17:45:01

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19785710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档