Tag: padding

结构填充在C结构序列化中的影响(保存到文件)

我在C中有以下结构: typedef struct sUser { char name[nameSize]; char nickname[nicknameSize]; char mail[mailSize]; char address[addressSize]; char password[passwordSize]; int totalPoints; PlacesHistory history; DynamicArray requests; }User; typedef struct sPlacesHistory { HistoryElement array[HistorySize]; int occupied; int last; }PlacesHistory; 和function: void serializeUser( User * user, FILE * fp ) { fwrite( user, nameSize + nicknameSize + mailSize + addressSize + passwordSize […]

结构填充是否可以由用户代码安全使用?

假设我有一个如下所示的结构: struct Struct { char Char; int Int; }; 和sizeof( int )大于1并且编译器为Char成员变量添加填充 – 编译器生成的代码是否允许更改填充字节的值? 我的意思是,如果我使用指针运算并将一些数据写入Char成员变量周围的填充字节,然后执行variable.Char =赋值,编译器生成的代码是否也可能会覆盖某些填充字节?

在套接字上发送一个结构,在C中使用正确的填充和字节序

我有几个结构定义为通过不同的操作系统(tcp网络)发送。 定义的结构是: struct Struct1 { uint32_t num; char str[10]; char str2[10];} struct Struct2 { uint16_t num; char str[10];} typedef Struct1 a; typedef Struct2 b; 数据存储在文本文件中。 数据格式如下: 123 馅饼 脆皮 Struct1a存储为3个单独的参数。 但是,struct2是两个独立的参数,第二行和第三行都存储在char str []中。 问题是当我通过多个网络写入服务器时,数据未正确接收。 有许多空间可以分隔结构中的不同参数。 当我写入服务器时,如何确保正确的发送和填充? 如何正确存储数据(动态缓冲区或固定缓冲区)? write的例子:write(fd,&a,sizeof(typedef struct a)); 它是否正确? 问题接收struct2的侧输出: 123(,) 0(,馅饼) 0(地壳) 正确的输出 123(馅饼,地壳)

具有位字段的结构中的偏移量

如果我们有一个带有位字段的结构,那么后续成员如何在结构中对齐? 请考虑以下代码: struct A{ int a:1; char b; // at offset 1 }; struct B{ int a:16; int b: 17; char c; // at offset 7 }; printf(“Size of A: %d\n”, (int)sizeof(struct A)); printf(“Offset of b in A: %d\n”, (int)offsetof(struct A, b)); printf(“Size of B: %d\n”, (int)sizeof(struct B)); printf(“Offset of c in B: %d\n”, (int)offsetof(struct […]

结构对齐填充,最大填充大小和结构成员的顺序

我一直在学习结构数据填充,因为我发现我的sizeof()运算符没有返回我的预期。 根据我观察到的模式,它将结构成员与最大的数据类型对齐。 所以例如…… struct MyStruct1 { char a; // 1 byte char b; // 1 byte char c; // 1 byte char d; // 1 byte char e; // 1 byte // Total 5 Bytes //Total size of struct = 5 (no padding) }; struct MyStruct2 { char a; // 1 byte char b; // […]

何时复制填充字节 – 结构赋值,按值传递,其他?

在调试问题时,出现了以下问题。 (请忽略次要代码错误;代码仅供参考。) 定义了以下结构: typedef struct box_t { uint32_t x; uint16_t y; } box_t; 这个结构的实例正在通过函数的值传递(显然简化): void fun_a(box_t b) { … use b … } void fun_b(box_t bb) { // pass bb by value int err = funa(bb); } void fun_c(void) { box_t real_b; box_t some_b[10]; … … use real_b and some_b[] … … funb(real_b); funb(some_b[3]); … […]

为什么GCC填充这个位域?

程序在C中使用std = c99,这是在64位机器上。 struct epochs { volatile unsigned int epoch : 1; volatile unsigned int pulse : 1; volatile unsigned int active0 : 7; volatile unsigned int active1 : 7; volatile unsigned int counter0 : 24; volatile unsigned int counter1 : 24; }; 当我检查sizeof(epochs)它给了我12。 我可以告诉gcc不要通过添加__attribute((packed))来填充它; 所以我可以解决它。 但是我真的想知道为什么要添加4个字节来填充这个64位结构? 这里的主要内容是这个结构需要64位,因为它在64位primefaces交换操作中一次更新,当然这对12字节值不起作用。

联合中的填充是否存在

大家好, 我想知道联盟是否使用填充? 由于union的大小是最大的数据成员大小,最后是否可以填充?

找到结构中填充的大小和位置的方法?

我正在尝试编写一个工具,将一些包含结构的C代码作为输入。 它将编译代码,然后查找并输出编译器决定添加到其中的结构的任何填充的大小和偏移量。 对于使用offsetof,sizeof和一些添加的已知结构,这是非常简单的,但我无法想出一个简单的方法来自动为任何输入结构做。 如果我知道如何遍历结构中的所有元素,我想我可以毫无问题地编写工具,但据我所知,没有办法做到这一点。 我希望一些StackOverflow人会知道一种方式。 但是,我并没有停留在我的方法中,而且我当然愿意接受在结构中查找填充的任何替代方法。

如果在int之后出现char,为什么要添加填充?

例如,有一种结构 struct A { char a; int i; }; 在这种情况下,我们有[1字节] +填充[3字节] + int [4字节] = 8。 现在让我们对上面的struct进行一些更新, struct A { int i; char a; }; 在这种情况下,char来自int并且不需要添加填充字节,这意味着sizeof(A)= 5字节,但在这种情况下我也得到8字节的结果。 为什么? 好的,这个案子怎么样 struct s { int b; double c; char a; }; 根据下面给出的逻辑,有一个: size = b[4 bytes] + padding[4 bytes] + c[8] + a[1] + padding[7 bytes to […]