c语言数组在内存中是怎么分配的?

比如inta[10]比如我的栈区的内存栈底是高地址,chari,a【10】是怎么分配的呢我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是... 比如int a[10]
比如我的栈区的内存栈底是高地址,char i,a【10】是怎么分配的呢

我是用vc6调试的,看来结果跟大家的一样,char[9]和i相差了3个地址,也就是他们之间空了两个地址,

我就想知道这是怎么回事,内存对齐的话为什么是空两个地址呢?

i和数组都是字符型的,为什么会牵扯到内存对齐的问题呢?
展开
 我来答
灬哟无0C
2010-06-04 · 超过10用户采纳过TA的回答
知道答主
回答量:20
采纳率:0%
帮助的人:0
展开全部
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就是原来的栈指针的值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6bfaa54
2010-06-04 · TA获得超过492个赞
知道小有建树答主
回答量:308
采纳率:0%
帮助的人:423万
展开全部

你下断点调试一下就知道了

栈是倒着排列的,所以i在最后,

顺序是

a[0]   0x22ff20

a[1]   0x22ff21

a[2]

a[3]

...

a[9]

i

a[0]在栈顶

具体见下图,可以看到内存地址

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1cc8dd7af
推荐于2017-09-21 · TA获得超过1025个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:278万
展开全部
局部变量才在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就是出错了。

怎么分配你可以自己打写个小测试程序。

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个字节。如果没有地址对齐的话应该是连续在栈上分配的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lyjack2000
2010-06-04 · 超过14用户采纳过TA的回答
知道答主
回答量:33
采纳率:100%
帮助的人:0
展开全部
如果静态内存分配:a[0] a[1]。。。。a[9],地址由低到高,一般系统每个int元素占4byte
如果栈区:地址由高到低 b a[9] a[8]...a[1] a[0]
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yicaifenchen
2010-06-04 · 超过46用户采纳过TA的回答
知道答主
回答量:192
采纳率:0%
帮助的人:144万
展开全部
int a[10];

a[0] a[1] a[2] ..... a[9]
地址依次从低到高
因为是int型数组所以他们均相距sizeof(int) 个字节
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式