Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 如何将结构明确地对齐为4字节_C_Struct - Fatal编程技术网

C 如何将结构明确地对齐为4字节

C 如何将结构明确地对齐为4字节,c,struct,C,Struct,下面的代码片段,我们如何使下面的结构定义为4字节对齐 我已经尝试了pragma pack来显式对齐。但是它并没有按照我们想要的那样工作 #pragma pack(push) #pragma pack(4) //..struct devine here. #pragma pack(pop); 我已经尝试了显式对齐\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu struct device_inf

下面的代码片段,我们如何使下面的结构定义为4字节对齐

我已经尝试了
pragma pack
来显式对齐。但是它并没有按照我们想要的那样工作

#pragma pack(push)
#pragma pack(4)
//..struct devine here.
#pragma pack(pop);
我已经尝试了显式对齐
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

struct device_info {
    //
}__attribute__(packed);
//struct device_info dev_info;
sizeof (struct device_info)=211
struct device_info {
    //
};
typedef struct device_info deice_info __attribute__(packed)
device_info dev_info;
sizeof (dev_info)=211
我已经尝试了显式对齐
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

struct device_info {
    //
}__attribute__(packed);
//struct device_info dev_info;
sizeof (struct device_info)=211
struct device_info {
    //
};
typedef struct device_info deice_info __attribute__(packed)
device_info dev_info;
sizeof (dev_info)=211
问题1:

如何明确对齐
struct device\u info
offsetof
输出,如下所示:

    offsetof magic=0
    offsetof is_unlocked=16
    offsetof is_tampered=20
    offsetof is_unlock_critical=24
    offsetof charger_screen_enabled=28
    offsetof display_panel=32
    offsetof booloader_version=96
    offsetof radio_version=160
    offsetof verity_mode=224
    offsetof is_origin=228

代码段:

#define DEVICE_MAGIC_SIZE 13
#define MAX_PANEL_ID_LEN 64
#define MAX_VERSION_LEN 64
struct device_info{
    unsigned char magic[DEVICE_MAGIC_SIZE];
    bool is_unlocked;
    bool is_tampered;
    bool is_unlock_critical;
    bool charger_screen_enabled;
    char display_panel[MAX_PANEL_ID_LEN];
    char booloader_version[MAX_VERSION_LEN];
    char radio_version[MAX_VERSION_LEN;
    bool verity_mode;
    bool is_origin;
};

更新1

我试过下面的代码片段

struct device_info{
    __attribute__((__aligned(4))) bool is_unlock;
    //...
};
这是同样的工作很好

问题二:

两者有什么区别

struct device_info{
    __attribute__((__aligned(4))) bool is_unlock;
    //...
};

问题3


我们如何在源代码编译期间转储以执行二进制或库?(预处理->编译->链接)objdump?或其他?

因为C11可以使用标准。
这将解决您的问题。

因为C11您可以使用标准。
这将解决您的问题。

在您的实现中,
sizeof(bool)
似乎等于1。在这种情况下,填充规则被正确遵守,因此
未锁定
可以在
magic
之后精确显示,而无需额外填充

另一件事是
bool
是实现定义的。请阅读此帖:


您可能会从中受益更多的是,当您以绝对尺寸布置结构时,使用
中的适当类型。如果希望布尔值为32位整数,则使用
int32\u t
uint32\u t

在实现中,
sizeof(bool)
似乎等于1。在这种情况下,填充规则被正确遵守,因此
未锁定
可以在
magic
之后精确显示,而无需额外填充

另一件事是
bool
是实现定义的。请阅读此帖:


您可能会从中受益更多的是,当您以绝对尺寸布置结构时,使用
中的适当类型。如果希望布尔值为32位整数,请使用
int32\u t
uint32\u t

C++和C是两种不同的语言,根据您实际使用的语言,问题的答案会有所不同。请选择一种,然后从你的问题标签中删除另一种语言。
#pragma pack(40)
对我来说似乎有点不合适。至于属性,您试图将其应用于
typedef
,我认为这是不允许的。@MatteoItalia,很抱歉出错。
#pragma pack(4)
看起来,如果您使用4字节类型而不是
bool
,所有内容都将正确对齐,而无需任何技巧。@Austings两个数组元素的地址之间的字节差异是数组元素类型的大小C++和C是两种不同的语言,你的问题的答案会因你所说的语言而异。请选择一种,然后从你的问题标签中删除另一种语言。
#pragma pack(40)
对我来说似乎有点不合适。至于属性,您试图将其应用于
typedef
,我认为这是不允许的。@MatteoItalia,很抱歉出错。
#pragma pack(4)
看起来,如果使用4字节类型而不是
bool
,则所有内容都将正确对齐,而无需任何技巧。@Austings两个数组元素的地址之间的字节差异,是数组元素类型的大小谢谢。对齐的4字节仅适用于此struct@caopeng
struct alignas(4)foo{…}是否被
gcc
遵从的参数禁用?谢谢。对齐的4字节仅适用于此struct@caopeng
struct alignas(4)foo{…}它是否被
gcc
兼容参数禁用