gpt4 book ai didi

c - 如果只使用第一个元素,我是否必须为整个结构分配内存?

转载 作者:行者123 更新时间:2023-12-04 10:47:42 25 4
gpt4 key购买 nike

我有一个结构,其中第一个元素被测试并且取决于它的值结构的其余部分将被读取或不被读取。在第一个元素的值决定不读取结构的其余部分的情况下,我是否必须为整个结构分配足够的内存或仅为第一个元素分配足够的内存?

struct element
{
int x;
int y;
};

int foo(struct element* e)
{
if(e->x > 3)
return e->y;
return e->x;
}

主要是:

int i = 0;
int z = foo((struct element*)&i);

我假设如果只为第一个元素分配是有效的,那么我将不得不警惕任何可能试图复制结构的东西。即,将结构传递给函数。

最佳答案

不要将您的信息强加到不需要的结构中:不要将结构用作函数的参数。

要么将结构的成员传递给函数,要么使用继承:

typedef struct {
int foo;
} BaseA;

typedef struct {
int bar;
} BaseB;

typedef struct {
BaseA a;
BaseB b;
} Derived;

void foo(BaseB* info) { ... }

...
Derived d;
foo(&d.b);
BaseB b;
foo(&b);

如果您只是好奇(并且真的不要使用它):您可以。

typedef struct {
int foo, goo, hoo, joo;
} A;

typedef struct {
int unused, goo;
} B;

int foo(A* a) { return a->goo; }

...
B b;
int goo = foo((A*)&b);

通常,您必须分配一个内存块,其字节数至少与完全读取结构中具有最大偏移量的访问成员所需的字节数相同。此外,在写入此 block 时,您必须确保使用与原始结构中相同的成员偏移量。

要点是,一个结构只是一 block 内存,不同的区域分配了不同的解释(int、char、其他结构等...)并且访问结构的成员(在重新排序和对齐之后)归结为简单读取或写入内存位。

关于c - 如果只使用第一个元素,我是否必须为整个结构分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413882/

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