2013-02-04 68 views
1

嗨我想做一個函數,計算沒有填充字節的結構的大小。函數計算大小的結構沒有填充字節

實施例:

struct test{ 
    int x; 
    char y; 
    int z; 
}; 

如果我計算上述結構的大小我必須得到9字節(不即填充字節)

而考慮的情況下,其中i可能不知道存在於結構中的可變。

實施例:

struct test{ 
    int x; 
    .... 
    .... 
    .... 
    int z; 
}; 

所以,如果我計算大小它應該給正確的大小。

是否有可能做寫出這樣的功能?我試着閱讀結構的,但我不力找到任何solution.I看到有一些編譯器選項是從我可以存在,但我不希望任何在建編譯器選項。

+0

您可以隨時添加您自己的尺寸函數或使用sizeof與一些特殊的編譯器特定的魔法。 – andre

+1

'#pragma pack(1)'強制它降低到未加墊大小? – Dukeling

+0

@Dukeling我知道通過標準選項我會得到,因爲我提到的問題,但我不需要這樣的選項。 –

回答

3

不,C沒有足夠的反思來使這成爲可能。在運行時,程序可以用來「知道」結構中的哪些字段,或者它們的類型是什麼,沒有任何信息。

+0

確定對於案例2有效。但假設我們知道結構的變量? –

+2

將每個變量傳遞給'sizeof()'並將大小相加 –

+0

@DavidHeffernan是的,這可能是一個不錯的選擇。 –

3

sizeof編譯器結構應該爲您提供「編譯器看到它」的對象大小。大多數編譯器將以4個字節邊界對齊結構,以犧牲空間爲代價實現有效的內存訪問。嘗試

#include <stdio.h> 
int main() { 
    struct test{ 
    int x; 
    char a; 
    int y; 
    }; 
    struct test myStruct; 
    printf("size of myStruct is %ld\n", sizeof(myStruct)); 
} 

當我運行它,我得到

size of myStruct is 12 

這表明我的編譯器,在這種情況下,被分配四個字節爲「A」。 我認爲這是你的答案......除非我真的誤解了你的問題,特別是你的「沒有填充字節」的評論。

重寫struct的定義爲:

struct test{ 
    int x; 
    char a; 
    int y; 
    }__attribute__((packed)); 

輸出成爲

size of myStruct is 9 

在編譯時纔會有效 - 所以它不是一個真正的「功能」。如果你在編譯時不知道你的結構,它就不適用。因此,我想我的答案和上面的@unwind給出的答案並不矛盾。

+0

將給我整個結構的大小,即12個字節而不是9個字節。 –

+0

運算符的大小將給出整體結構的大小,即(int 4,char 1(3字節段)1 + 3 = 4,int 4,所以總數 - 4 + 4 + 4 = 12。但是我需要執行,即9個字節。 .. –

+0

好吧我想現在你得到如何打印12正確? –