如何知道在C中转换为void指针的结构大小?

问题描述 投票:1回答:1

在我的代码中,有两种类型引用结构: TypeX和typeX。

TypeX是一个void指针,typeX是结构类型。 在将内存分配给typeX变量之后,我将它(已转换)传递给TypeX变量(或void指针)。

我想得到以下结构的大小转换为void指针:

#include <stdio.h>
#include <stdlib.h>

struct _typeX {  
    double a;  
    double b;  
};  

typedef struct _typeX typeX;
typedef void* TypeX;

int main(int argc, char const *argv[]) {  
    TypeX t = NULL;  
    typeX *t0 = NULL;

    t0 = (typeX *) calloc(1, sizeof(typeX));

    t0->a = 123;
    t0->b = 456;

    t = (TypeX) t0;

    printf("%lu\n", sizeof(*t0));
    printf("%lu\n", sizeof(*t));

    free(t);

    return 0;  
}  

但结构大小和void指针大小不同:

产量

16
1

有没有办法通过将void指针作为参数传递来正确识别结构大小?

c pointers struct sizeof void
1个回答
1
投票

首先,同时使用typeXTypeX但含义非常不同令人困惑。另外,不要隐藏typedef后面的指针。

至于你的问题:不,你无法恢复t指向的对象的大小。

sizeof EXPR为您提供EXPR类型的大小(以字节为单位)。实际值是什么并不重要(事实上,EXPR甚至没有被评估1)。

考虑

char c;
int i;
double d[100];

TypeX p1 = (TypeX)&c, p2 = (TypeX)&i, p3 = (TypeX)d;

所有p1p2p3都具有相同的类型,因此sizeof将为它们返回相同的值,即使它们指向的对象具有非常不同的大小。

最后,sizeof (void)不是标准C中的东西.GCC允许它作为扩展(并返回1),但它会警告你,如果你启用-pedantic诊断,这是非标准的。

1 - 有一个相对模糊的例外,我将忽略它。

© www.soinside.com 2019 - 2024. All rights reserved.