【问题标题】:How to know struct size casted to void pointer in C?如何知道在 C 中转换为 void 指针的结构大小?
【发布时间】:2018-09-11 19:23:57
【问题描述】:

在我的代码中,有 2 种类型引用结构:
TypeXtypeX

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;  
}  

但结构体大小和空指针大小不同:

输出

16
1

有没有办法通过传递一个空指针作为参数来正确识别结构体的大小?

【问题讨论】:

  • sizeof(*t) -- 当 t 的类型为 void* 时,在 C 中无效。您的编译器可能允许它作为扩展。要回答您的问题,无法从void* ptr 中知道原始大小。您需要将它传递给单独的变量或转换为适当的类型并使用sizeof
  • sizeof(void) 对于 gcc 为 1,但在标准中未定义。一旦您转换为 void,您就会丢失类型信息。 C++ 隐藏了类型信息,您可以使用dynamic_cast 尝试猜测void 后面的类型。您可以使用 C 中的“自定义”结构手动实现它。
  • 好奇是什么激发了这个问题......
  • 一个空指针根据定义是一个指向未知事物的指针,所以不,不再可能知道它所指向的东西的大小。通过其他方式跟踪是您的工作。
  • typeXTypeX 是两个完全不同的东西真的是故意困难和迟钝。

标签: c pointers struct sizeof void


【解决方案1】:

首先,同时拥有typeXTypeX 但含义截然不同,这非常令人困惑。另外,不要将指针隐藏在 typedef 后面。

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

sizeof EXPR 为您提供 EXPR 的 type 的大小(以字节为单位)。实际值是多少并不重要(事实上,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 - 有一个相对模糊的例外,我将忽略它。

【讨论】:

  • 谢谢。我没有这样想。我忘了用-pedantic haha​​
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2023-03-26
  • 2016-11-10
  • 1970-01-01
  • 2022-01-17
  • 2023-02-26
  • 2011-10-27
  • 2018-06-01
相关资源
最近更新 更多