C语言数组定义地址分配问题

intmonths[]={31,28,31,30,31,30,31,31,30,31,30,31};intweek[]={0};这是程序中数组用到的数组定义语句,数组首地... int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int week[] = {0};
这是程序中数组用到的数组定义语句,数组首地址:addr(months) = 0x0012ff18;addr(week) = 0x0012ff14.
很奇怪,这里数组months 并没有 分配12个Int 大小空间,而是和week数组重叠了……这是什么原因哪???
展开
 我来答
斯坦恩贝格(北京)电子有限公司
2015-10-21 · 斯坦恩贝格生产销售“希曼顿”牌固态继电器、电力调整器,温控器
斯坦恩贝格(北京)电子有限公司
斯坦恩贝格生产销售“希曼顿”牌固态继电器、电力调整器,温控器
向TA提问
展开全部
使用C语言编程,实际上使用的内存只有一种——虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此。其中,栈区、静态数据区、堆区都会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存。

1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧。比如下面的代码:
int main()
{
//定义一个有20个int元素的数组。此时数组a分配的虚拟内存称为栈区,有编译器自行分配。
int a[20] = {0};
return 0;
}

2、静态数据区:这实际上对应于生成的可执行文件的.data区段,因为这个区段在生成的可执行文件中,因此是“静态的”。比如下面的代码:
//定义一个20个int元素的全局数组,此时数组分配的虚拟内存称为静态数据区,有编译器自行分配。
int g_a[20];
int main() { return 0;}

3、堆区:堆区是最复杂的,有操作系统负责堆管理,但是当用C语言编译器生成一个可执行文件并且运行时,它会默认建立一些堆。拿Windows来说,每一程序运行,它会建立至少两个堆,一个是默认堆,一个是new堆。比如下面的代码:
int main()
{
int *pa = (int*)malloc(sizeof(int)*20);//分配20个int元素大小的堆空间。
return 0;
}
WM_THU
2013-07-04 · TA获得超过7164个赞
知道大有可为答主
回答量:4285
采纳率:80%
帮助的人:3940万
展开全部
week数组只有一个元素,一共只占4byte,没错啊。months排在week后面。
这是因为你声明week数组的时候没有显式指明其长度,那么编译器就会根据初始化内容的长度进行内存分配,你的初始化内容只有一个int,因此week的长度就是1。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hanfengyipo
2013-07-04 · 超过22用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:52.2万
展开全部
一点都不奇怪啊。。。months排在week后面,你去搜一下,大端与小端,就明白了。。。

有的系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff14.

相反也有系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff18 + 12*sizeof(int)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
推荐于2016-10-14 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部
注意week地址和months地址的大小
week=0x0012ff14
months=0x0012ff18
也就是说week在前的
即week占用了0x0012ff18-0x0012ff14=4字节的空间
而months占用的空间数,在这里并不能确定,因为不知道下一个数组占用的地址值
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式