不同类型变量在计算机内存当中分配的地址
今天偶然发现一个问题把我搞懵逼了,定义的不同类型变量在计算机内存中分配的顺序不一致。在一个进程定义不同类型的变量,char类型地址低于int类型;数组则相反,char []地址高于int[];并且数组地址要高于变量地址。
下面贴一下实际现象。
这是测试代码
#include <stdio.h> /********** * 变量在内存中的地址分配。同一个程序先定义的在低地址,并且由数据类型排序,char类型排在int前面。 * * **********/ void test_one(void); void test_two(void); int main() { test_one(); printf("--------------------------\n"); int arr; printf("arr %p\n",&arr); printf("--------------------------\n"); test_two(); return 0; } void test_one() { int a = 10; int b; char aa; int c; printf("aa addr = %p\n",&aa); printf("a addr = %p\n",&a); //printf("%d\n",a); printf("b addr = %p\n",&b); printf("c addr = %p\n",&c); printf("--------------------------\n"); test_two(); } void test_two() { int a; int b; int c; //int arr[5]; char arry[3]; int arr[5]; //int d; printf("a addr = %p\n",&a); //printf("%d\n",a); printf("b addr = %p\n",&b); printf("c addr = %p\n",&c); //printf("d addr = %p\n",&d); printf("arry %p %p %p %p\n",arry,&arry[0],&arry[1],&arry[2]); printf("arr %p %p %p %p\n",arr,&arr[0],&arr[1],&arr[2]); }
这是运行结果:
aa是char类型变量,地址小于a、b、c三个变量,在子函数中再调用一个函数创建变量,新创建的三个变量地址比已创建的变量地址低。
char[]的地址高于int[],就算把定义顺序调整也是一样的结果。定义int [5],char[]和int[]地址相差32个字节。实际int[5]只占20字节,但是分配了32个字节的数量。
q@qiamn:~/C$ ./question
aa addr = 0x7ffc4ac897db
a addr = 0x7ffc4ac897dc
b addr = 0x7ffc4ac897e0
c addr = 0x7ffc4ac897e4
--------------------------
a addr = 0x7ffc4ac89784
b addr = 0x7ffc4ac89788
c addr = 0x7ffc4ac8978c
arry 0x7ffc4ac897b0 0x7ffc4ac897b0 0x7ffc4ac897b1 0x7ffc4ac897b2
arr 0x7ffc4ac89790 0x7ffc4ac89790 0x7ffc4ac89794 0x7ffc4ac89798
--------------------------
arr 0x7ffc4ac89804
--------------------------
a addr = 0x7ffc4ac897b4
b addr = 0x7ffc4ac897b8
c addr = 0x7ffc4ac897bc
arry 0x7ffc4ac897e0 0x7ffc4ac897e0 0x7ffc4ac897e1 0x7ffc4ac897e2
arr 0x7ffc4ac897c0 0x7ffc4ac897c0 0x7ffc4ac897c4 0x7ffc4ac897c8


浙公网安备 33010602011771号