首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-15 
关于栈中内存分配的问题char s[] 34char d[] 56cout&sendl&dendl输出为0x22f680x22f58

关于栈中内存分配的问题
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;
}
几是不知道这个东西在什么地方给分配了的,任务管理器里的内存在运行该程序时候是没有后明显正加的..

热点排行