c语言数组在内存中是怎么分配的?
比如inta[10]比如我的栈区的内存栈底是高地址,chari,a【10】是怎么分配的呢我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是...
比如int a[10]
比如我的栈区的内存栈底是高地址,char i,a【10】是怎么分配的呢
我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是他们之间空了两个地址,
我就想知道这是怎么回事,内存对齐的话为什么是空两个地址呢?
i和数组都是字符型的,为什么会牵扯到内存对齐的问题呢? 展开
比如我的栈区的内存栈底是高地址,char i,a【10】是怎么分配的呢
我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是他们之间空了两个地址,
我就想知道这是怎么回事,内存对齐的话为什么是空两个地址呢?
i和数组都是字符型的,为什么会牵扯到内存对齐的问题呢? 展开
13个回答
展开全部
int a[10];
首先每个int占4个字节,所有要为局部变量a申请40个字节的栈空间,要申请栈空间,就是把SP(栈指针)的值减去40,然后a就是指向(SP-40)的指针,a[0]的地址就是(SP-40),a[1]的地址就是(SP-36),a[2]的地址就是(SP-32),以此类推。当然这些地址的计算工作都是编译器在背后帮我们算好了,并存放在exe或dll文件里了。char i,a【10】也是一样的原理。
如果这样还是不明白的话,你可以在调试进断点的时候,右键源代码,选中“Go To Disassembly”进入汇编调试页。你可以看到,每个函数开始的时候都是有这几行:
push ebp //保存源指针的值,这里不用管它
mov ebp,esp //把栈指针的值赋值给ebp,在这个函数里面,都是通过这个ebp减去某个数值来操作局部变量的。
sub esp, D0h //这个函数要里总共要用到的栈空间,就是这句话申请的它的意思是"esp=esp-D0h".
int a[10];a[1]=1;
的汇编代码就是
mov dword ptr [ebp-28h],1
ebp就是原来的栈指针的值。
首先每个int占4个字节,所有要为局部变量a申请40个字节的栈空间,要申请栈空间,就是把SP(栈指针)的值减去40,然后a就是指向(SP-40)的指针,a[0]的地址就是(SP-40),a[1]的地址就是(SP-36),a[2]的地址就是(SP-32),以此类推。当然这些地址的计算工作都是编译器在背后帮我们算好了,并存放在exe或dll文件里了。char i,a【10】也是一样的原理。
如果这样还是不明白的话,你可以在调试进断点的时候,右键源代码,选中“Go To Disassembly”进入汇编调试页。你可以看到,每个函数开始的时候都是有这几行:
push ebp //保存源指针的值,这里不用管它
mov ebp,esp //把栈指针的值赋值给ebp,在这个函数里面,都是通过这个ebp减去某个数值来操作局部变量的。
sub esp, D0h //这个函数要里总共要用到的栈空间,就是这句话申请的它的意思是"esp=esp-D0h".
int a[10];a[1]=1;
的汇编代码就是
mov dword ptr [ebp-28h],1
ebp就是原来的栈指针的值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
局部变量才在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就是出错了。
怎么分配你可以自己打写个小测试程序。
void test(void)
{
char i,a[10];
printf("0x%x", &i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
}
还有可能有对齐的问题,可能你会看到分配的地址不连续。
void test(void)
{
char i;
int j;
printf("0x%x", &i);
printf("0x%x", &j);
}
如果你看到的地址不连续,比如说4字节对齐的话,i占了一个字节,还剩下3个字节,而j要4个字节,上面剩下的3个字节不能容下j,剩下的3个字节就会不被利用,这时j和i的地址就不连续,会差3个字节。如果没有地址对齐的话应该是连续在栈上分配的。
怎么分配你可以自己打写个小测试程序。
void test(void)
{
char i,a[10];
printf("0x%x", &i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
}
还有可能有对齐的问题,可能你会看到分配的地址不连续。
void test(void)
{
char i;
int j;
printf("0x%x", &i);
printf("0x%x", &j);
}
如果你看到的地址不连续,比如说4字节对齐的话,i占了一个字节,还剩下3个字节,而j要4个字节,上面剩下的3个字节不能容下j,剩下的3个字节就会不被利用,这时j和i的地址就不连续,会差3个字节。如果没有地址对齐的话应该是连续在栈上分配的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果静态内存分配:a[0] a[1]。。。。a[9],地址由低到高,一般系统每个int元素占4byte
如果栈区:地址由高到低 b a[9] a[8]...a[1] a[0]
如果栈区:地址由高到低 b a[9] a[8]...a[1] a[0]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a[10];
a[0] a[1] a[2] ..... a[9]
地址依次从低到高
因为是int型数组所以他们均相距sizeof(int) 个字节
a[0] a[1] a[2] ..... a[9]
地址依次从低到高
因为是int型数组所以他们均相距sizeof(int) 个字节
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询