巧妙獲取結構體大小

2021-07-02 05:43:12 字數 518 閱讀 8348

在/sys/un.h中有這麼乙個巨集:

#define sun_len(ptr) ((size_t)(((struct sockaddr_un *)0) ->sun_path) + strlen((ptr)->sun_path))
這個巨集的巧妙之處是在不需要分配記憶體的情況下可以獲取結構各個部分(除了最後乙個)的大小

如:

struct aa;

int size_of_b = &(((struct a*) 0)->c);

這裡利用了結構體的記憶體分配模型來達到效果,在結構體中相鄰結構的記憶體一般是相鄰分配的,所以int c開始的位址就是b結尾的位址,用c開始的位址減去結構體a的起始位址就是b的大小,那麼如果需要c的大小怎麼辦呢?可以這樣做:

int size_of_c = &(((struct a*)0)->c) - &(((struct a*)0)->d)

如此類推便可算出任意一部分的長度,除了最後一部分外。

巧妙運用大小端與共用體

今天遇到乙個問題 題目描述 實現函式 unsigned int ipanel parse ip addr const char ip 測試用例 unsigned int ip addr ipanel parse ip addr 192.168.10.1 printf x n ip addr 請在程式...

結構體大小

含有基本型別的結構體的大小所對應的最終決定因素是結構體內自身成員的分布。成員不同的分布將導致含有相同成員結構體大小的不同,每個成員的對齊都是以緊接著後面的乙個為參考的,如果緊接著的大於對應指定,就以緊接著的為對齊因子,否則將聯絡周圍的具體情況進行對齊,而且對齊因子只有三種型別 1,2,4。對於最後一...

結構體大小

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...