gpt4 book ai didi

c - C中的结构内存对齐

转载 作者:太空宇宙 更新时间:2023-11-04 05:13:15 24 4
gpt4 key购买 nike

我对以下 C 程序有疑问

代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
struct a
{
char arr[10];
int i;

float b;
}v[2];

printf("\n %d %d %d \n",v[0].arr, &v[0].i, &v[0].b);
printf("\n %d %d %d \n",v[1].arr, &v[1].i, &v[1].b);


printf("\nHello world!\n");
return 0;
}

输出:

 2686712   2686724  2686728

2686732 2686744 2686748

Hello world!

问题:v[0].arr == 2686712 和 arr[10] 大小为 10 字节&v[0].i <<<< 这个地址应该在数组之后立即开始..因为数组是 10 个字节 .. &v[0].i 的地址应该从 2686712+10 开始,即 2686722为什么 &v[0].i == 2686724 而不是 2686722

最佳答案

编译器填充结构成员以保持每种数据类型的正确对齐。

参见 this link有关结构填充实际如何工作的信息。那里有很多非常详细的信息。另见 this link用于各种数据类型的特定于英特尔处理器的对齐信息。

本质上,因为您有一个 10 字节的 char 数组,后跟一个 int,编译器用额外的 2 个字节填充了 char 数组,以便 int 将在 4 字节边界上正确对齐(即,一个可以被 4 整除的地址)。

就好像你这样声明你的结构:

struct a
{
char arr[10];
char _padding[2];
int i;
float b;
};

出于习惯,我通常分配大小可以被 4 整除的 char 数组。这样编译器就不必为我做这件事,而且它更容易可视化数据结构在内存中的样子.

关于c - C中的结构内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22615841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com