求解!C++里定义变量后内存分配问题!
不知道是不是每台电脑都是一样的规律,我定义了三个int变量,然后用指针弄出地址,然后依次输出,结果发现最先定义的变量地址是最大的,三个的顺序是从下到上,这有点像堆栈的感觉...
不知道是不是每台电脑都是一样的规律,我定义了三个int变量,然后用指针弄出地址,然后依次输出,结果发现最先定义的变量地址是最大的,三个的顺序是从下到上,这有点像堆栈的感觉,难道他们是先都被放到了堆栈里?还是本来就在内存中,只是内存分配原则和堆栈类似??
展开
展开全部
楼主,首先要明确一件事。静态内存是被放在栈中的。(你说的堆栈实际上就是栈区)
c++中,内存的分配方式分两种,一种是静态的,一种是动态的。这里面你所分配的都是静态内存,而静态内存是储存在栈区中的。栈区有一个特点,其生长方向是向着地址减少的方向的。也就是说,你每次静态的分配一个变量,其地址会比之前的变量小。这也就不难解释,为什么会有这样的输出。
楼主,如果你想要学好C++,内存管理一定要学好。这个问题在C++中非常的重要。
c++中,内存的分配方式分两种,一种是静态的,一种是动态的。这里面你所分配的都是静态内存,而静态内存是储存在栈区中的。栈区有一个特点,其生长方向是向着地址减少的方向的。也就是说,你每次静态的分配一个变量,其地址会比之前的变量小。这也就不难解释,为什么会有这样的输出。
楼主,如果你想要学好C++,内存管理一定要学好。这个问题在C++中非常的重要。
追问
奥,那如果在汇编下定义了一个变量,它是在栈中么(好像是在定义的数据段中,数据段应该不像栈那样是反向的)?要是代码里有个入栈操作,入的栈应该是另一个自己定义的栈吧?是不是我还没有理解栈这个东西啊。
追答
栈这个东西本质上是一个数据结构,而正因为栈区使用的栈这种数据结构来实现的。所以才会称之为栈区。而你的入栈操作是你将你的数据存放到预先定义好的存储结构中(这要具体看你是用什么实现的栈了),这里的入栈操作,实际上和栈区内存的推入原理是一样的,因为他们都是栈这种数据结构。
对于栈这个东西,楼主不要只是局限在具体的一个事物上,实际上它并没有什么神秘的,它只是一种数据结构而已。
参考资料: http://blog.csdn.net/zhanghefu/article/details/5003407
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家提供动态住宅IP的服务商。动态住宅IP可以为用户提供更加灵活和稳定的网络连接,同时也可以用于一些特定的网络应用场景,例如网络游戏、视频直播等。使用StormProxies的动态住宅IP服务,用户可以通过更换IP...
点击进入详情页
本回答由Storm代理提供
展开全部
C++中局部变量,全局变量,函数参数分配内存的顺序:
局部变量:
在局部变量分配空间的顺序跟变量的声明顺序直接相关,同时按照内存由高到低的顺序进行空间分配。 (当然 main函数的内存也被分配在栈上)
全局变量:
事实上,全局变量不管有没有被初始化,其实都是被存放在DATA这个域中的,但是唯一不同的是这个DATA数据域有的时候又被划分成几个小的区域(说有的时候是因为并不是所有的系统都一定会这样做),分成initialized和un-initialized,因此,我们讨论的全局变量默认初始化或者初始化为零时,数据存储在un-initilized区域中,被初始化为非零时,数据存储在initialized区域中
函数参数:
程序中定义的函数中的局部变量 和 main函数中 变量的分配顺序一样
这分配原则 当然 和堆栈相关:
局部常量一般在栈上分配内存空间;而new ,malloc,calloc,realloc 是在堆上或者自由存储区的内存区域分配内存
局部变量:
在局部变量分配空间的顺序跟变量的声明顺序直接相关,同时按照内存由高到低的顺序进行空间分配。 (当然 main函数的内存也被分配在栈上)
全局变量:
事实上,全局变量不管有没有被初始化,其实都是被存放在DATA这个域中的,但是唯一不同的是这个DATA数据域有的时候又被划分成几个小的区域(说有的时候是因为并不是所有的系统都一定会这样做),分成initialized和un-initialized,因此,我们讨论的全局变量默认初始化或者初始化为零时,数据存储在un-initilized区域中,被初始化为非零时,数据存储在initialized区域中
函数参数:
程序中定义的函数中的局部变量 和 main函数中 变量的分配顺序一样
这分配原则 当然 和堆栈相关:
局部常量一般在栈上分配内存空间;而new ,malloc,calloc,realloc 是在堆上或者自由存储区的内存区域分配内存
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是这样的.在main里.其实就是一个栈内存了,a,b,c都是栈里的.
sub esp,0x[XX] 做完了后,add esp,0x[XX]
可以debug.进入汇编模式.就一清二楚了.
sub esp,0x[XX] 做完了后,add esp,0x[XX]
可以debug.进入汇编模式.就一清二楚了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是堆栈啊,而且window系统,定义的自动变量全从高地址像低地址生长的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询