對的,結構體型別的定義只是告訴編譯器該如何表示資料,但是它沒有讓計算機為其分配空間。結構體型別的定義就是結構體的宣告,不管是定義還是申明,這句話都是正確的。
只有在結構體變數,宣告的時候可以分配。要使用結構體,那麼就需要建立變數,也就是結構體變數。
建立一個結構體變數:struct book library
看到這條指令,編譯器才會建立一個結構體變數library,此時編譯器才會按照book模板為該變數分配記憶體空間,並且這裡儲存空間都是以這個變數結合在一起的。
同時後面訪問結構體變數成員的時候,就要用到結構體變數名來訪問。
擴充套件資料:
結構體的大小通常是結構體所含變數大小的總和,但是對於結構體中比較小的成員,可能會被強行對齊,造成空間的空置,這和讀取記憶體的機制有關,為了效率。
通常32位機按4位元組對齊,小於的都當4位元組,有連續小於4位元組的,等到湊整,加上下一個元素超出一個對齊位置,才開始調整,比如3+2或者1+4,後者都需要另起(下邊的結構體大小是8bytes)。
struct s
{
char a;
short b;
int c;
}
相應的,64位機按8位元組對齊。
不過對齊不是絕對的,用#pragma pack()可以修改對齊,如果改成1,結構體大小就是成員變數大小的總和。
對的,結構體型別的定義只是告訴編譯器該如何表示資料,但是它沒有讓計算機為其分配空間。結構體型別的定義就是結構體的宣告,不管是定義還是申明,這句話都是正確的。
只有在結構體變數,宣告的時候可以分配。要使用結構體,那麼就需要建立變數,也就是結構體變數。
建立一個結構體變數:struct book library
看到這條指令,編譯器才會建立一個結構體變數library,此時編譯器才會按照book模板為該變數分配記憶體空間,並且這裡儲存空間都是以這個變數結合在一起的。
同時後面訪問結構體變數成員的時候,就要用到結構體變數名來訪問。
擴充套件資料:
結構體的大小通常是結構體所含變數大小的總和,但是對於結構體中比較小的成員,可能會被強行對齊,造成空間的空置,這和讀取記憶體的機制有關,為了效率。
通常32位機按4位元組對齊,小於的都當4位元組,有連續小於4位元組的,等到湊整,加上下一個元素超出一個對齊位置,才開始調整,比如3+2或者1+4,後者都需要另起(下邊的結構體大小是8bytes)。
struct s
{
char a;
short b;
int c;
}
相應的,64位機按8位元組對齊。
不過對齊不是絕對的,用#pragma pack()可以修改對齊,如果改成1,結構體大小就是成員變數大小的總和。