2013-02-19 103 views
0
#include <stdio.h> 

#define SIZE 10 

typedef struct dynArrStruct 
{ 
    double value1; 
    int value2; 
    int value3; 
}dynArr; 

int main(int argc, char** argv) 
{ 
    dynArr a1[SIZE]; 
    dynArr* a2[SIZE]; 
    printf("Size of a1 array: %d\n", sizeof(a1)); 
    printf("Size of a2 array: %d\n", sizeof(a2)); 
    return 0; 
} 

第一打印出160sizeof我的結構數組是不同的...爲什麼?

第二打印出40.

我的數字元件每4個字節,存在用於第二一個10個元素。但我不明白爲什麼第一個有160.

謝謝。

+1

你可以打印出'sizeof(double)'和'sizeof(int)'並加起來。 – timrau 2013-02-19 14:24:24

+0

你從哪裏得到元素大小爲4的想法?嘗試打印'sizeof(dynArr)'。 – 2013-02-19 14:24:52

回答

14

a1是一個結構數組,a2是一個結構體指針數組。


a1SIZE(10)結構,在連續的存儲器佈置。

----------- ----------- ------- ----------- ----------- 
| struct0 | | struct1 | | ... | | struct8 | | struct9 | 
----------- ----------- ------- ----------- ----------- 

它的大小是SIZE * sizeof(dynArr) = 10 * 16 = 160

爲什麼每結構16個字節?

typedef struct dynArrStruct 
{ 
    double value1; // sizeof(double) = 8 
    int value2; // sizeof(int) = 4 
    int value3; // sizeof(int) = 4 
} dynArr; 

取這些的總和,你有16個字節。 (甚至可能比單獨的大小取決於填充的總和)


a2SIZE(10)的指針結構,在連續的存儲器佈置。其大小爲SIZE * sizeof(dynArr*) = 10 * 4 = 40

爲什麼每個指針有4個字節?

這是大多數32位系統上指針的大小。

1

假設你的平臺上,這

typedef struct dynArrStruct 
{ 
    double value1; /* 8 Bytes */ 
    int value2;  /* 4 bytes */ 
    int value3;  /* 4 Bytes */ 
}dynArr; 

,並有結構元素之間沒有填充字節。

然後,該結構的大小將是16個字節,所以16×10 = 160

0

a1是你的情況的結構的陣列。該結構本身的大小爲16字節(double是8字節,int是4字節),所以你得到160字節的大小。

a2是一個指針數組。一個指針的大小是4字節(由於你的32位系統),所以你得到的總大小爲40字節。

記住這一點,a2未初始化。所以它並不包含你的結構,它只是保留一些空間,你可以存儲指向你的結構的指針。

相關問題