1. 程式人生 > 其它 >不同型別變數在計算機記憶體當中分配的地址

不同型別變數在計算機記憶體當中分配的地址

今天偶然發現一個問題把我搞懵逼了,定義的不同型別變數在計算機記憶體中分配的順序不一致。在一個程序定義不同型別的變數,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