2016-01-08 49 views
0

CMSG_ALIGN(i)的值是8的倍數的最小值是否正確>=如果i是一個無符號整數變量?CMSG_ALIGN宏的值是什麼

#include <stdio.h> 

int main(void) 
{ 
    int i; 

    for (i=0; i<50; ++i) { 
     printf("%d\n", CMSG_ALIGN(i)); 
    } 
} 

輸出I得到:

/*  i    CMSG_ALIGN(i) 
* 
*  0      0 
*  [1,8]     8 
*  [9,16]    16 
*/ 

回答

2

是否正確地說的CMSG_ALIGN(i)的值是 數倍的8和>的最小值= i如果i是一個無符號int變量?

否。對於給定值的對齊方式在所有平臺上不一定是8。如果總是8,則根本不需要CMSG_ALIGN()

您可能是在64位系統上。所以它在8字節邊界上對齊。但是,如果您在32位平臺上運行相同的代碼,則可能會看到它是4字節對齊。

請注意,CMCG_ALIGN()返回size_t。所以%zu是打印size_t值的正確格式字符串。

+0

謝謝!我測試了sizeof(struct cmsghdr),值是16.三個成員是cmsg_len,cmsg_level和cmsg_type。爲什麼sizeof(struct cmsghdr)不是12? – hel

+0

[struct padding](https://en.wikipedia.org/wiki/Data_structure_alignment)。這是爲了對齊而完成的。請參閱:[爲什麼不是一個結構的sizeof等於每個成員的sizeof之和?](http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to -the-sum-of-sizeof-of-member) –

+0

在我的問題sizeof(struct cmsghdr)中,成員'cmsg_len'是'socklen_t',4B(總共12B爲3個成員),但是我發現'cmsg_len'是我的系統中的'size_t',8B(3個成員共16B)。我在目錄/ usr/include中使用命令vi -t cmsghdr – hel