【发布时间】:2018-09-11 19:23:57
【问题描述】:
在我的代码中,有 2 种类型引用结构:
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;
}
但结构体大小和空指针大小不同:
输出
16
1
有没有办法通过传递一个空指针作为参数来正确识别结构体的大小?
【问题讨论】:
-
sizeof(*t)-- 当t的类型为void*时,在 C 中无效。您的编译器可能允许它作为扩展。要回答您的问题,无法从void*ptr 中知道原始大小。您需要将它传递给单独的变量或转换为适当的类型并使用sizeof。 -
sizeof(void)对于 gcc 为 1,但在标准中未定义。一旦您转换为 void,您就会丢失类型信息。 C++ 隐藏了类型信息,您可以使用dynamic_cast尝试猜测void后面的类型。您可以使用 C 中的“自定义”结构手动实现它。 -
好奇是什么激发了这个问题......
-
一个空指针根据定义是一个指向未知事物的指针,所以不,不再可能知道它所指向的东西的大小。通过其他方式跟踪是您的工作。
-
让
typeX和TypeX是两个完全不同的东西真的是故意困难和迟钝。
标签: c pointers struct sizeof void