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数组重叠了……这是什么原因哪??? 展开
int week[] = {0};
这是程序中数组用到的数组定义语句,数组首地址:addr(months) = 0x0012ff18;addr(week) = 0x0012ff14.
很奇怪,这里数组months 并没有 分配12个Int 大小空间,而是和week数组重叠了……这是什么原因哪??? 展开
4个回答
展开全部
使用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;
}
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;
}
展开全部
week数组只有一个元素,一共只占4byte,没错啊。months排在week后面。
这是因为你声明week数组的时候没有显式指明其长度,那么编译器就会根据初始化内容的长度进行内存分配,你的初始化内容只有一个int,因此week的长度就是1。
这是因为你声明week数组的时候没有显式指明其长度,那么编译器就会根据初始化内容的长度进行内存分配,你的初始化内容只有一个int,因此week的长度就是1。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一点都不奇怪啊。。。months排在week后面,你去搜一下,大端与小端,就明白了。。。
有的系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff14.
相反也有系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff18 + 12*sizeof(int)
有的系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff14.
相反也有系统是addr(months) = 0x0012ff18;addr(week) = 0x0012ff18 + 12*sizeof(int)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
注意week地址和months地址的大小
week=0x0012ff14
months=0x0012ff18
也就是说week在前的
即week占用了0x0012ff18-0x0012ff14=4字节的空间
而months占用的空间数,在这里并不能确定,因为不知道下一个数组占用的地址值
week=0x0012ff14
months=0x0012ff18
也就是说week在前的
即week占用了0x0012ff18-0x0012ff14=4字节的空间
而months占用的空间数,在这里并不能确定,因为不知道下一个数组占用的地址值
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询