2013-12-10 144 views
0

我寫了一個簡單的結構程序。下面是我寫打印的結構 -爲字符編譯後得到錯誤的結構體大小數據類型

#include<stdio.h> 

main() 
{ 
struct book 
    {char name[10]; 
    int pages; 
    float price; 
    }b1={"Blue",500,200.00}; 
printf("The Address Of Name Is = %d ",&b1.name); 
printf("\nThe Address Of Pages Is = %d",&b1.pages); 
printf("\nThe Address Of Price Is = %d",&b1.price); 

} 

內聲明的變量的大小程序的代碼現在,當我編譯程序並運行它的問題出現了。我將CHARACTER數組的大小打印爲12個字節而不是10個字節。這裏是輸出 -

[email protected]:~$ ./a.out 
The Address Of Name Is = 1264893904 
The Address Of Pages Is = 1264893916 
The Address Of Price Is = 1264893920 

有人可以請解釋爲什麼會發生這種情況嗎?另請注意,我正在Linux環境中運行。

回答

1

這是因爲Data Structure Alignment,這意味着編譯器會在類/結構中的變量之間插入填充以確保下一個變量落在內存訪問的最佳邊界上。每種類型都有所不同。

有一個在這個答案在這裏一個完整的解釋: Why isn't sizeof for a struct equal to the sum of sizeof of each member?

但對於你的情況,一個整數的排列是4,所以便將你10高達12。即在char[]int之間存在填充以確保該整數在4字節邊界上開始。

+0

我知道由於編譯器完成了這個填充,程序運行得更快。現在一個問題是,如果人們能夠檢測到不同架構下的地址必須在多少個地址中,那麼該如何檢測?就像在x86上一樣,它必須有所不同,而在一些不同的架構上,它必須是其他的數字。 –

+0

在C++ 11中,您可以使用http://en.cppreference.com/w/cpp/language/alignof – Salgar

相關問題