问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于C/c++内存分配问题

发布网友 发布时间:2023-08-31 20:14

我来回答

3个回答

热心网友 时间:2023-09-17 14:51

前者和后者都一样犯了同一个错误
由于变量是在栈中分配 每个程序都有自己的栈,也就是这里面的数据不会被其他的程序修改,但是可能会被你自己修改。
所以当你立刻返回这个地址,并且立刻按照正确的类型读取它那么你所获得的值是正确的.这就是你的试验结果 看起来没有什么错误.
但是这种小"技巧"很可能让你的程序崩溃或者运行结果谬之千里。因为当你返回了已经释放的局部变量的内存的时候。那块内存可以被分配给其他变量,也就是说你的指针指向的是一块不知道属于哪个变量的内存.因为这块内存随时可以分配给程序中的其他变量.并且值会随之改变.
请看如下代码:
#include <stdio.h>
#include <stdlib.h>
int *fun()
{
int *pi;
int i=3;
pi=&i;
printf("fun: %p\n",pi);
return pi;
}
int *fun2()
{
int *pi;
int i=7;
pi=&i;
printf("fun1: %p\n",pi);
return pi;
}

int main(void)
{
int*p=fun();
p=fun();
printf("%p\n",p);
p=fun2();
printf("%p\n",p);

system("pause");
}

你会发现fun()和fun2()中的局部变量的地址是一样的
也就是说fun()返回的指针所指向的内存,p指向的内存随时会意外改变
再试试如下代码
#include <stdio.h>
#include <stdlib.h>
int *fun()
{
int *pi;
int i=3;
pi=&i;
printf("fun: %p\n",pi);
return pi;
}
int *fun2()
{
int *pi;
int i=7;
pi=&i;
printf("fun1: %p\n",pi);
return pi;
}\
int * funset(int k){
int *pi;
int i=k;
printf("funset: %p\n",&i);
return &i;
}

int main(void)
{
int*p=fun();
printf("%p\n",p);
printf(" %d\n\n",*p);//输出p指向的内存值
p=fun();
printf("%p\n",p);//第二次调用fun(),p没有改变 说明两次调用函数局部变量用的是同一块内存,也就是内存被重新分配了。
printf(" %d\n\n",*p);
p=fun2();
printf("%p\n",p);//调用另一个函数p还是局部变量地址还是没变,这个函数用得还是同一块内存。
printf(" %d\n\n",*p);
p=funset(100);//猜猜这个函数干了什么,你就会明白.
//我猜你没有打算改变p所指向的内存吧。
printf("%p\n",p);//调用另一个函数p还是局部变量地址还是没变,这个函数用得还是同一块内存。
printf(" %d\n\n",*p);
system("pause");
}
----------
书上说不要返回局部变量的地址就是因为这个地址指向的内存已经是free的
随时可以分配给别的变量。
free的内存,它不是由你使用的,而是由程序自动使用,程序会随时让这个内存发生你没打算干的改变.比如分配给别的局部变量,栈的分配工作是在编译期决定的。不是动态分配。
-----------
你再想想假如你做了如下的事情

返回了一个局部变量的地址保存到p中
你以为这块内存没有变化并且打算利用这块内存保存点东西。
然后调用了一个函数。
然后你莫名其妙的发现p所指向的内存莫名其妙的变化了。

热心网友 时间:2023-09-17 14:52

main中返回的地址当然和函数内的数组地址是相同的,这是函数返回值设计的最重要原因之一,只是出了函数体,这个地址指向的内存空间“并不存在”了(可能被回收,可能被其它程序占用)。

所以当你再次去访问时,不仅编译过程中会警告你,甚至报错,即使你侥幸运行起来,也会弹出内存不可访问的错误。

热心网友 时间:2023-09-17 14:52

详细讲起来很复杂,我给你找到一个文章:
http://blog.csdn.net/newman0708/archive/2009/08/02/4401983.aspx
你自己仔细体会吧.

参考资料:http://blog.csdn.net/newman0708/archive/2009/08/02/4401983.aspx

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下: 从乌鲁木齐到石河子怎么坐车 乌鲁木齐回石河子的第一个疫情检查站在哪里 商标补证的话要多少时间? 商标补证要多长时间? 孩子的行为不良怎样引导? 以太网没有有效的ip配置,小编教你以太网没有有效的ip配置怎么解决_百度... 东海福居新天地楼盘地址在哪里? 东海东城新苑楼盘地址在哪里? 翡翠吊坠如何编好看翡翠吊坠怎么编好看 翡翠挂件如何编制翡翠挂件怎么编制 如何打翡翠挂件结 翡翠小挂件怎么编好看 夏天的太阳,人能晒晒太阳么, 有没有专门给铜制品工厂用的安检门 工厂安检需要用电脑吗 windows服务启动失败是怎么回事? 环球互易集团销售怎么样 你好,我QQ 被冻结了,QQ 安全中心也登不上,也解除不了安全模式,它要_百 ... 高校收取重修费是合理的吗? 最新海之蓝38度多少钱一瓶 花钱了为什么不能说微博 奥迪a6l波箱油滤的位置介绍 奥迪a6l加机油的位置图 新款奥迪a6l机油从哪里放掉 实习生看不懂代码会被辞退吗 有个头很大的白色的卡通叫什么 git无法拉取clean 香油渣子怎么给草莓施肥? 汽车的后视镜加热是怎么回事 装完固态硬盘电脑蓝屏重启怎么办 2021年轻薄本市场年度总结:各大品牌产品线点评及竞争力分析_百度... 剑魂之刃精英关卡13怎么打 精英关卡13攻略心得 剑魂online如何二星升三星 装备升星攻略全新分享 星级武器如何升级?DNF剑魂二次觉醒Q&A问答 《金色花》这首诗依次描绘了哪几个画面 大油怎么做油饼 买的肥肉没加盐,熬油油滓有盐味怎么回事? 肥肉臭了遨游该放什么那油就不会臭