2015-11-20 102 views
0
typedef struct { 
char valid; 
char tag; 
char block[4]; 
} line; 

我相信它是6,因爲block[]是4,每個char是1個字節。這是在x86機器上。 validtag之間是否有偏移?應該是8嗎?這個結構的大小是多少?

+1

'printf(「%zu」,sizeof line);'可能會告訴你嗎? – kaylum

+4

這是編譯器,系統/對齊依賴。編譯器或系統如何處理填充將導致計數因編譯器到編譯器等而異。 –

+0

C規範強加的唯一限制是在「有效」之前不能有填充。編譯器可以根據需要在成員之間放置儘可能多的填充,並在結構的末尾放置填充。 – user3386109

回答

1

這是6.簡單的調用sizeof將證實這一點。 這是問題還是有任何其他問題有關填充結構?

4

如果您希望結構的大小使用sizeof運算符。

例如

size_t struct_size = sizeof(line); 

它以字節爲單位返回結構體的大小。請注意sizeof(char)== 1總是,所以在技術上字節並不總是意味着8位。

C:TCN, "Page 348" at the bottom of the page: -

這在理論上可以爲機器擁有煤焦大於8 位,雖然它不是託管環境(基本上, 臺式電腦等非常普遍 - - 所需的唯一環境甚至具有開始的功能)。

在這樣一臺機器, 出乎很多人的意料,的sizeof(char)的仍是1; 更改的值是CHAR_BIT。與此相關的是,在這樣的機器上,int可能仍然有它的要求範圍 ,但是它的大小與char相同。

因此,這樣的機器上,有 可能存在無符號字符中的至少一個值,使得,轉換 爲int,這是一個負值,並與等於EOF。然而,據我所知,所有提供了getchar()函數和相關函數的這樣的系統已經確保實際上EOF值不同於實際上可以從文件中被讀取的任何值 。例如,char可以是32位類型,但在讀取文件中的「字符」時, 仍然只能看到值0-255。

從WG14 n1256 - 部分6.5.3.4:

sizeof運算符產生大小(以字節計)其操作數的 ...當應用於具有類型,無符號字符中的操作數,或有符號字符, (或其合格版本)結果爲1.

+0

* ...技術上字節並不總是意味着8位。* - 我可以知道嗎?你的答案還不清楚。 –

+1

@Am_I_Helpful C不要求char是8位,sizeof(char)== 1。如果由於某種原因char是32位,那麼32位是一個字節。我已經看到了通常用作最小信息單元的術語字節;我不認爲它需要8位。請參閱本頁的第348部分(靠近底部):https://www.seebs.net/c/c_tcn4e.html –

+0

我正在對我們的答案進行必要的編輯以突出顯示這些行。 –

0

只需使用sizeof。這裏是一個程序來告訴你線的大小:

#include <stdio.h> 

typedef struct { 
    char valid; 
    char tag; 
    char block[4]; 
} line; 

int main(void) { 
    printf("%zu\n", sizeof(line)); 
    return 0; 
} 
0

您可以使用sizeof函數獲取已用內存來分配該結構。

printf("%i" , sizeof(line));