C语言函数返回指针 结果异常

发布于 2022-09-11 16:36:46 字数 572 浏览 27 评论 0

问题描述

各路大神,我直接上代码了。如下:

#include <stdio.h>

int *get() {
    int a = 1;
    int *p = &a;
    return p;
}

int main() {
    int *pptr;
    pptr = get();

    int *ptr = get();

    printf("%d\n", *ptr);
    printf("%d\n", *pptr);
}

clipboard.png

clipboard.png

如代码所示,ptr和pptr两个指针都是获取到get()返回的同一个地址。然而,打印出来的两个值却是不一样的。而且每次第二个值都是不一样的。是不是指针的地址移动了?请大神们指示一下,感激不尽!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冬天的雪花 2022-09-18 16:36:46

重复运行了 同一个函数

早茶月光 2022-09-18 16:36:46

ptrpptr实际上都是指的函数geta的地址,a是函数内的局部变量,每次执行都会重新分配栈,肯定地址不一样。

日记撕了你也走了 2022-09-18 16:36:46

同一个函数运行了两次,里面的变量地址怎么会一样呢 不是变量名一样地址就非要一样吧

椵侞 2022-09-18 16:36:46

main函数中的pptr和ptr都指向了函数get函数中的局部变量的地址,而get中的局部变量在函数结束时就释放掉了,即main中的指针指向的已释放的地址,取其中的值的操作行为是未定义的,结果是随机的

我ぃ本無心為│何有愛 2022-09-18 16:36:46

哈哈,这个问题猛一看有点弱智(不好意思哈),但是细看一下却有点意思。

首先就像楼上所说,ptr和pptr是两次函数调用时的局部变量地址,同一个局部变量两次调用所分配的地址未必相同,这个是肯定的。

但是!!两次连续调用同一个函数,所分配的栈帧却很有可能是一样的,道理很简单,应用程序的栈通常都是连续分配的,随着一层层调用逐步向下增长。所以前一个get函数调用完之后立即再调用一次,不出意外的话两次栈帧应该是一样的。这一点在题主调试的时候也多次重现了。

那么为什么两个地址相同的指针打印出来的值却不一样呢?答案是“你这两个指针是外部公共地址,谁规定它必须一样啊!!”

仔细看,谁最有可能修改了这个地址上的值?哈哈,不好意思,虽然隐藏的很好但还是被找到了,那就是printf!

第一次打印的时候,ptr的值在printf的栈帧分配前就先行取出来了,所以printf可以打印出1,但随着printf的运行,它覆盖掉了该地址上的值,后面再取值的时候就已经不是原值了。

题主可以交换一下两个打印语句,你会发现第一次打印总是对的,第二次就错了,跟打印的是ptr还是pptr无关。

所以,明白了原理,以后就知道为什么不能这么用了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文