读书人

关于栈中内存分配的有关问题

发布时间: 2012-02-15 12:09:44 作者: rapoo

关于栈中内存分配的问题
char s[]= "34";
char d[] = "56";
cout<<&s<<endl<<&d<<endl;

输出为
0x22f68
0x22f58

谁能解释一下为什么分配的内存不连续?

[解决办法]
为了内存管理的方便, 编译器在为你分配变量内存空间时, 并不是按照你请求的字节数来分配, 通常会>=请求数

结合你的例子:
char s[]= "34" 和 char d[] = "56"
数组变量s,d都需要3个字节的内存空间, 但编译器为他们分配内存时, 最小的内存块估计是:
0x22f68 - 0x22f58 = 0x10
为16个字节, 所以你会看到现在的结果

根据编译器的不同, 最小内存块的大小可能会不同
[解决办法]
若在Borland C++下面做出来,则相差是3.
可能各个编译器的默认对齐不同。
依你的描述,相差了16个字节(128位)。好像有点奇怪。
[解决办法]
连续是偶然不连续是必然。

全局/静态数据区:存储全局变量,和静态变量static声明的变量
常量存储区:存储常量,如char *s="abcde"; 或者 const int i =10;
代码区:这个不说了。代码放的地儿

栈:临时变量,参数等,有大小限制,vc6/7: 1M

堆: 用户自己维护的空间,内存使用需要自己申请,自己释放。大小基本不限(4G)

example:

#include <iostream>
using namespace std;

int global = 100; //全局/静态区
const int N = 10; //常量区

int main()
{
static int a = 0; //全局/静态区

char arr[100]="test";//arr分配在栈上,"test"分配到常量区,还有一个副本在栈上


char *s = "abcde";//s分配在栈上,"abcde"分配在常量区
char*str = NULL; //str分配在栈上

str = new char[10];//str所指向的空间分配在堆上
delete []str;

return 0;
}
[解决办法]
确实,我用vc6编译时, 他们的地址相差4, 符合intel架构下按字(4字节), 双字(8字节), 4字(16字节)的内存边界对齐

不知道lz的编译器和编译环境是什么, 还是lz的代码或者描述有误

总结: 对于大多数应用来说, 讨论这些细节完全没有必要, 编译器和架构系统已经为我们考虑了足够多
只是我们在遇到这样的情况时, 知道应该是什么原理所致就可以了, 不必对此表示诧异

探讨
若在Borland C++下面做出来,则相差是3.
可能各个编译器的默认对齐不同。
依你的描述,相差了16个字节(128位)。好像有点奇怪。

[解决办法]
楼主多半是用的VS的Debug。试试Release。
[解决办法]
我也遇到了同样的问题啊
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
int pt[200000000];
printf("%ld",sizeof(pt));
return 0;
}
几是不知道这个东西在什么地方给分配了的,任务管理器里的内存在运行该程序时候是没有后明显正加的..
[解决办法]
探讨
我也遇到了同样的问题啊
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
int pt[200000000];
printf("%ld",sizeof(pt));
return 0;
}
几是不知道这个东西在什么地方给分配了的,任务管理器里的内存在运行该程序时候是没有后明显正加的..

读书人网 >C++

热点推荐