2016-10-02 23 views
0

使用union,我們當然可以有一個包含不同數據類型元素的數組。非齊次數組的內存分配是如何工作的?

例如現在

struct elements { 
    int s; 
    union { 
     int ival; 
     float fval; 
     char *pval; 
    } element; 
}; 
struct darray { 
    struct elements items[100]; 
}; 

,我們可以宣佈它可以包含不同的數據類型的元素的數組:

struct darray a; 

是什麼困擾着我:只有工會的單個成員可以在單一時間存在,但我們已經有了一個包含100個元素的數組。這些元素沒有初始化,但是不應該在這裏分配內存?

內存分配如何在這樣的數組中工作?

+1

你說:「我們當然可以有一個包含不同類型元素的數組」。這是不正確的;你只能有一個同類型的數組。你只顯示一個同類型的數組 - 類型是struct elements,它是一個包含三個不同類型的int和union的類型,但struct元素的大小始終相同。 –

回答

0

讓我們來看看以下的一段代碼:

#include <stdio.h> 
#include <stdlib.h> 

typedef union __attribute__((__packed__)) { 
    int ival; 
    int fval; 
    char* pval; 
} element; 

typedef struct __attribute__((__packed__)) { 
    int  s; 
    element e; 
} elements; 

typedef struct __attribute__((__packed__)) { 
    elements items[100]; 
} darray; 

int main() 
{ 
    darray d = {0}; 
    printf("size of element: %lu.\n", sizeof(element)); 
    printf("size of elements: %lu.\n", sizeof(elements)); 
    printf("size of darray: %lu.\n", sizeof(darray)); 
    return 0; 
} 
// The output is: 
// size of element: 8 
// size of elements: 12 
// size of elements: 1200 

現在,讓我們的解釋剛剛發生:

  1. 我使用的是64位的機器,使指針是大小爲8
  2. 我們使用__attribute__((__packed__)),以強制編譯器不與存儲額外的字節填充我們的結構的。這就像告訴他,使用最少量的內存來建立一個包含以下成員的結構。
  3. 請注意,儘管element現在正在運行,但它已經在編譯時間中有大小。元素的大小是8,爲什麼?工會的規模是由其更大的成員(這裏我們有int,這是4,float是4,而char*是8 [64位機再次...])。
  4. 現在我們知道union具有固定的大小,創建100個成員的數組將需要100 * sizeof(elements) = 100 * (sizeof(int) + sizeof(element)) = 100 * (4 + 8) = 1200字節的內存。
1

該數組是同類的,但它的內容包含一個聯合,它可能表示使用相同的基礎內存的不同類型。

每個元素都是它自己的對象,它有自己的成員s和元素。

您可以自由分配不同類型不同的元素:

enum 
{ 
    INT , 
    FLOAT , 
    STRING , 
} ; 

struct darray a; 
a.items[0].s = INT; 
a.items[0].element.ival = 12345; 
a.items[1].s = FLOAT; 
a.items[1].element.fval = 4.56F; 
a.items[2].s = STRING; 
a.items[2].element.pval = "string literal"; 

printf("%d %f %s\n" , a.items[0].element.ival , 
         a.items[1].element.fval , 
         a.items[2].element.pval); 

而不是包裹式結構元素融入式結構darray,你也可以簡單地定義類型結構元素的數組:

struct elements a[100]; 
+0

好的。如您所示,我可以爲不同的元素分配不同的類型,但「內存分配」是如何工作的? – user311413