关于栈中内存分配的问题
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的代码或者描述有误
总结: 对于大多数应用来说, 讨论这些细节完全没有必要, 编译器和架构系统已经为我们考虑了足够多
只是我们在遇到这样的情况时, 知道应该是什么原理所致就可以了, 不必对此表示诧异