Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么offsetof(成员)等于sizeof(结构)?_C++_Arrays_Sizeof_Offsetof - Fatal编程技术网

C++ 为什么offsetof(成员)等于sizeof(结构)?

C++ 为什么offsetof(成员)等于sizeof(结构)?,c++,arrays,sizeof,offsetof,C++,Arrays,Sizeof,Offsetof,我将结构定义为: struct smth { char a; int b[]; }; 当我在此结构上调用sizeof和offsetof时: cout << sizeof(struct smth) << endl; cout << offsetof(struct smth, b) << endl; 为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4? 为什么会有填充物? 另外,为什么int数组根本不占用任何

我将结构定义为:

struct smth
{
    char a;
    int b[];
};
当我在此结构上调用
sizeof
offsetof
时:

cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;
为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4? 为什么会有填充物? 另外,为什么int数组根本不占用任何空间

为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4?为什么会有填充物

有填充,因为C标准允许它;编译器经常对齐变量以提高性能

另外,为什么第二个变量根本不占用任何空间(看起来是这样的)

它是一个C99灵活阵列成员-这就是它的全部要点。这样做的目的是分配您的结构,例如:

struct smth *s = malloc(sizeof *s + 10 * sizeof s->b[0]);

然后你会有一个结构,就像
b
是一个10元素数组一样运行。

因为成员
b
的大小为零,编译器在
a
b
成员之间添加填充,使得
b
位于“字”边界上


但是,如果我记得正确的,在这样的结构中有一个灵活的数组,除了C编译器之外,只有C++,而不是C++。

struct smth
{
    char a;
    int b[];
};

数组> <代码> b[] /Cord>在C++中无效。数组必须具有固定大小。可变长度数组仅在C99中有效


假设编译器支持它作为扩展,那么数组
b[]
的大小为零,这使得结构只包含
char
成员。在
struct
中填充的规则是有效的,将
struct
填充到一个字中,这个字在您的机器中有4个字节。

您的意思是
偏移(struct smth,b)
,对吗?@CarlNorum是的,我知道。是C还是C++?它们是不同的。@宇浩我特别要求C++,但是添加了C标签,所以人们也可以用它来找到它。这个问题的答案是什么?@biox6你应该用相对的标签来标记这个问题。C和C++在很多领域可能是相似的,它们在不同的方面是不同的。在这个问题上,例如,可变长度数组只在C中有效,而不是C++。这允许什么样的性能改进?只是好奇。@biox6,一些处理器加载指令只能从字对齐的地址加载字。如果你在一个不对齐的地址有一个词,你需要单独加载每个字节并重新组合。你的分配语句不考虑对齐约束。通常,它将无法分配正确的内存量。您可以使用
struct smth*s=malloc(offsetof(struct smth,b[10])分配一个大小合适的结构@IInspectable,怎么会这样<代码>malloc
需要返回安全对齐的指针,并且结构布局正确。有什么区别?可能是
10*sizeof s->b[0]
这是
intb[]
相当于int*b?不,不是
int*b
将使
sizeof(smth)
更大,额外的空间将用于存储某些int变量的地址。相反,
int b[]
表示该结构应作为单个内存块动态分配一些整数(编译时未知)。@mity如何为变量
b
赋值,您能给我赋值吗statement@Light参见卡尔·诺伦的答案。@Light:Given
struct smth*s=malloc(sizeof(*s)+10*sizeof(*s->b));
,您可以编写
s->a='c';s->b[0]=0;s->b[9]=9;
,等等。
struct smth
{
    char a;
    int b[];
};