ssj*_*ssj 42 c gcc sizeof flexible-array-member
我使用sizeof来获取C中结构的大小,但我得到的结果是意外的.
struct sdshdr {
int len;
int free;
char buf[];
};
int main(){
printf("struct len:%d\n",(sizeof(struct sdshdr)));
return 0;
} //struct len:8, with or without buf
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么不buf占用任何空间,为什么int64位CPU上的类型大小仍为4?
这是输出gcc -v:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
Lun*_*din 52
[]是一个灵活的数组成员.它们不计入结构的总大小,因为C标准明确地这样说:
6.7.2.1/18
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的阵列成员.在大多数情况下,将忽略灵活数组成员.特别地,结构的尺寸好像省略了柔性阵列构件,除了它可以具有比省略意味着更多的拖尾填充.
这是故意设计的,因为灵活的数组成员的目的是允许您在结构之后动态分配尾随数据.(当结构是文件头,协议头等时)
示例包括有关非标准gcc扩展和旧前C99"struct hack"的讨论.
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |