如何知道在 C 中转换为 void 指针的结构大小?
How to know struct size casted to void pointer in C?
在我的代码中,有 2 种引用结构的类型:
TypeX 和 typeX。
TypeX是空指针,typeX是结构类型。
将内存分配给 typeX 变量后,我将它(强制转换)传递给 TypeX 变量(或空指针)。
我想获取以下转换为 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
有什么方法可以通过将 void 指针作为参数传递来正确识别结构大小吗?
首先,同时具有 typeX
和 TypeX
但含义却截然不同,这非常令人困惑。另外,不要将指针隐藏在 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;
所有 p1
、p2
、p3
都具有相同的类型,因此 sizeof
将 return 所有它们的值相同,即使虽然他们指向的对象有非常不同的大小。
最后,sizeof (void)
不是标准 C 中的东西。GCC 允许它作为扩展(和 returns 1
),但它会警告你这是非-如果启用 -pedantic
诊断,则为标准。
1 - 有一个相对模糊的例外,我将忽略它。
在我的代码中,有 2 种引用结构的类型:
TypeX 和 typeX。
TypeX是空指针,typeX是结构类型。
将内存分配给 typeX 变量后,我将它(强制转换)传递给 TypeX 变量(或空指针)。
我想获取以下转换为 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
有什么方法可以通过将 void 指针作为参数传递来正确识别结构大小吗?
首先,同时具有 typeX
和 TypeX
但含义却截然不同,这非常令人困惑。另外,不要将指针隐藏在 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;
所有 p1
、p2
、p3
都具有相同的类型,因此 sizeof
将 return 所有它们的值相同,即使虽然他们指向的对象有非常不同的大小。
最后,sizeof (void)
不是标准 C 中的东西。GCC 允许它作为扩展(和 returns 1
),但它会警告你这是非-如果启用 -pedantic
诊断,则为标准。
1 - 有一个相对模糊的例外,我将忽略它。