gpt4 book ai didi

c - 使结构成员成为虚拟的

转载 作者:行者123 更新时间:2023-11-30 15:27:39 25 4
gpt4 key购买 nike

我想将一 block 内存解析为一个结构。问题是成员不是一个接一个,有一些填充。

struct foo {
unsigned int a; // @ 0
unsigned int junk; // @ 0x4
unsigned int b; // @ 0x08
unsigned int more_junk;
.........
};

我不想为我拥有的每个垃圾分配结构中的每个成员。我知道这对于 union 是可能的,但对于结构则不确定。

更新我再举一个更清楚的例子:

#include <stdio.h>
#include <string.h>

main()
{

struct w {
unsigned long a;
unsigned long b;
unsigned long c;
unsigned long d;
};

struct w *q;

unsigned long array[] =
{
0x11111111,
0x22222222,
0x33333333,
0x44444444
};

q = (struct w*)array;

printf("%x\n", q->a);
printf("%x\n", q->b);
printf("%x\n", q->c);
printf("%x\n", q->d);

}

输出为:

11111111
22222222
33333333
44444444

可以说 3 是垃圾。同样的例子:

#include <stdio.h>
#include <string.h>

main()
{

struct w {
unsigned long a;
unsigned long b;
unsigned long d;
};

struct w *q;

unsigned long array[] =
{
0x11111111,
0x22222222,
0x33333333,
0x44444444
};

q = (struct w*)array;

printf("%x\n", q->a);
printf("%x\n", q->b);
printf("%x\n", q->d);

}

输出为:

11111111
22222222
33333333

但应该是:

11111111
22222222
44444444

最佳答案

there is some padding.

确实如此。这就是为什么结构体不适合用于内存映射并且是危险的。

The problem is that the members are not one after another I don't want to assign each member in the struct for every junk that I have

不太清楚你的意思。如果您不愿意,则不必分配任何内容。但是,您确实需要声明垃圾字节的去向空间。只需在结构中声明一个虚拟变量,稍后您将忽略该变量,就像在第一个结构示例中所做的那样。

没有办法解决这个问题,唯一的选择是使用完全不同的数据结构,例如原始数据的纯字节数组。但这很难让你的程序更容易阅读。

但是,如果不需要保留垃圾字节,即您进行内存映射,而只是对您感兴趣的数据进行一些“挑选”,那么您就不需要垃圾字节在结构中。但您必须手动分配每个成员,而不是使用 memcpy。

I know that this is possible with unions

不,不是,我认为您误解了 union 的运作方式。

关于c - 使结构成员成为虚拟的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26907224/

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