定义连续两个相同长度数组,两个数组地址间隔长度不等于数组长度
原因:编译器的优化和填充。
在C语言中,当定义两个连续的、固定大小的数组时,这两个数组在内存中的布局会受到几个因素的影响,其中最主要的是对齐(alignment)和可能的填充(padding)。
对齐(Alignment)
对齐是内存访问效率的一个关键方面。现代计算机体系结构通常要求数据按照一定的对齐方式存储在内存中。例如,某些体系结构可能要求整型(int)数据在4字节边界上对齐,而双精度浮点型(double)数据则可能在8字节边界上对齐。这种对齐要求可以加快内存的访问速度,但也可能导致在数组或结构体之间出现额外的填充字节。
填充(Padding)
填充字节是编译器为了满足对齐要求而在数据项之间或数据项末尾插入的额外字节。这些字节对程序来说是透明的,不包含有用的数据。
对齐规则:为提高内存访问效率,编译器确实会进行填充和优化,并且通常编译器的对齐是与变量中最长的基本数据类型进行对齐,对齐的长度通常是4字节、8字节、16字节、32字节等这样的内存存取颗粒度。
栈中变量地址问题:
在C语言中,定义一个变量,通过&获得的内存地址是变量的第一个字节的内存地址。最先定义的变量,处在栈中的高地址。
假设定义一个int类型的变量a
int a;
如果a的地址是0x1c,那么:
a的第一个字节位于地址0x1c。
a的第二个字节位于地址0x1c + 1(即0x1d)。
a的第三个字节位于地址0x1c + 2(即0x1e)。
a的第四个字节位于地址0x1c + 3(即0x1f)。
a占的地址范围是0x000000000062FE1C-0x000000000062FE1F
b占的地址范围是0x000000000062FE18-0x000000000062FE1B