gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:36 24 4
gpt4 key购买 nike

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

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 指针作为参数传递来正确识别结构大小?

最佳答案

首先,同时拥有 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;

p1, p2, p3 都是相同的类型,所以 sizeof 会返回相同的值对于所有这些,即使它们指向的对象具有非常不同的大小。

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

1 - 有一个相对模糊的异常(exception),我将忽略它。

关于c - 如何知道在 C 中转换为 void 指针的结构大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52282908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com