gpt4 book ai didi

C memcpy 到结构分配

转载 作者:行者123 更新时间:2023-12-05 01:27:28 28 4
gpt4 key购买 nike

我编写了一个简单的程序来测试使用 memcpy 将字节从字节缓冲区复制到结构。但是我没有得到预期的结果。

我分配了一个 100 字节的缓冲区,并将值设置为 0、1、2...99。然后我将这些字节复制到一个 16 字节的结构中。

某处字节 0x01 丢失。我试图了解正在发生的事情

#include <stdio.h>
#include <stdint.h>

struct Test {

uint8_t a;
uint16_t b;
uint32_t c;
uint64_t d;
uint8_t e;
};

int main(int argc, char** argv) {

uint8_t buffer[100];
for (uint8_t i = 0; i < 100; i++) {
buffer[i] = i;
}

struct Test test;
memcpy(&test, buffer, sizeof(struct Test));

printf("A is %ld and should be %ld\n", test.a, 0x00);
printf("B is %ld and should be %ld\n", test.b, 0x0201);
printf("C is %ld and should be %ld\n", test.c, 0x06050403);
printf("D is %ld and should be %ld\n", test.d, 0x1413121110090807);
printf("E is %ld and should be %ld\n", test.e, 0x15);
}

我得到的结果是:

A is 0 and should be 0
B is 770 and should be 513
C is 117835012 and should be 100992003
D is 1084818905618843912 and should be 1446519769808832519
E is 16 and should be 21

770(B值)是字节0302,不是0201(int 513)

最佳答案

这是因为编译器已将 padding 添加到您的结构中,以确保 b 在 16 位边界上对齐。因此,第二个字节未使用。

如果您开始重新排序您的结构,您会看到更大的变化。同样,32 位和 64 位值需要适合其类型的对齐方式。因此,由于填充,您最终可能会出现明显的“漏洞”。试试吧!

通常您会看到具有保留 成员的结构(特别是对于二进制格式),而不是依赖于填充。

关于C memcpy 到结构分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633342/

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