不同类型变量在计算机内存当中分配的地址

今天偶然发现一个问题把我搞懵逼了,定义的不同类型变量在计算机内存中分配的顺序不一致。在一个进程定义不同类型的变量,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

 

 

 

posted @ 2021-12-30 21:35  Qianm  阅读(527)  评论(0)    收藏  举报