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

时间:2018-09-11 19:23:57

标签: c pointers struct sizeof void

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

TypeX 是空指针,而 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

是否可以通过将空指针作为参数来正确识别结构大小?

1 个答案:

答案 0 :(得分: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),但是如果您启用{{ 1}}诊断。

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