一个想不明白的问题,求帮助

十七郎 2018-01-13 01:26:46
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * getStr()
{
char *p = "hi,friend";
return p;
}
int * getInt()
{
int a = 12;
int *p = &a;
printf("&a=%p, &p=%p\n", &p, p);
return p;
}

void main()
{
int *c = NULL;
c = getInt();
printf("c:%p %d\n", c,*c);
printf("hello...\n");
system("pause");
return;
}

===================================================
运行:

按理主函数调用子函数,子函数结束就应该销毁。释放对应的局部变量。 但各位看看这里的 1 调用完毕以后,2还能取出里面的值, 个人分析的图如下:不对之处,望指正

子函数返回的是指针(地址),主函数接收的也是指针(地址),子函数中对应的地址中的值应该在子函数运行过后就出栈了才对啊。个人分析返回得不到12才对。但事实非如此。望解惑。。。。。
...全文
489 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
faihung 2018-01-16
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
返回局部变量的地址是未定义的,这个未定义就是可能返回,也可能不能正确返回。 能够返回正确的值,说明getInt函数里a的内存尚未被其它函数栈占用(栈的使用是很频繁的)和使用。如果不能返回正确值,那么很有可能是局部变量a的内存被其他函数栈使用了,并将新的值覆盖了之前的a的内存。 所以说,返回局部变量的地址是无意义的。也是不能绝对的返回正确的值。建议不要这么做(返回局部地址)。
我也遇到过同样的问题,曾经我还想写出指针函数来,但是发现没有用一个指针做参数来接收数据来的实在方便。 你前面问我的那个问题,主要就是这个原因。
faihung 2018-01-16
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
这不能说明什么,最多说明你运气好,这块内存没被其他数据覆盖,你试下先输出别的再输出他就知了
我也遇到过同样的问题,曾经我还想写出指针函数来,但是发现没有用一个指针做参数来接收数据来的实在方便。
赵4老师 2018-01-15
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
自信男孩 2018-01-15
  • 打赏
  • 举报
回复
char * getStr()
{
    char *p = "hi,friend";
    return p;
}
接收getStr函数返回的地址是可以的,原因的是"hi,friend"的地址不在栈上,而是在只读数据段。因此返回的是只读数据段的地址,因此是可以正常输出字符串的。
自信男孩 2018-01-14
  • 打赏
  • 举报
回复
返回局部变量的地址是未定义的,这个未定义就是可能返回,也可能不能正确返回。 能够返回正确的值,说明getInt函数里a的内存尚未被其它函数栈占用(栈的使用是很频繁的)和使用。如果不能返回正确值,那么很有可能是局部变量a的内存被其他函数栈使用了,并将新的值覆盖了之前的a的内存。 所以说,返回局部变量的地址是无意义的。也是不能绝对的返回正确的值。建议不要这么做(返回局部地址)。
paschen 2018-01-14
  • 打赏
  • 举报
回复
这不能说明什么,最多说明你运气好,这块内存没被其他数据覆盖,你试下先输出别的再输出他就知了
大米粥哥哥 2018-01-13
  • 打赏
  • 举报
回复
内存是释放了 但没有消除 只是再访问可能会发生不好的事情
真相重于对错 2018-01-13
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <typeinfo>
#include <iostream>
#include <stdio.h>
using namespace std ;
int* fun1()
{
	int c=100;
	return &c;
}
int* fun2()
{
	int d=144;
	return &d;
}

int _tmain(int argc, _TCHAR* argv[])
{

	int* c= fun1();
	int* d= fun2();
	printf("%d,%p",*c,c);
	return 0;

}
最后输出多少呢? 这段代码可能会加深你的认识!
真相重于对错 2018-01-13
  • 打赏
  • 举报
回复
所谓出栈,并不是把栈内部全部清除,只是调整ESP指针

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧