gpt4 book ai didi

c - 指向结构体和类型转换的指针

转载 作者:行者123 更新时间:2023-11-30 14:26:22 25 4
gpt4 key购买 nike

C 语言确保指向任意 struct 的指针可以转换为void *反之亦然。此外,该语言允许定义指向 struct 的指针。如果未定义也是如此。我认为,由于编译器对这些结构一无所知,因此它们的指针应该具有相同的物理表示。让我们将这些行视为两个单独的模块:

/* FILE1.c */
void *mem = ...; //Points to a suitable memory block
struct s1 *p1; //No implementation given for struct s1
void *mem2;

p1 = (struct s1 *)mem;
mem2 = &p1;


/* FILE2.c */
extern void *mem2;
struct s2 { /*...fields...*/ };
struct s2 *p2;

p2 = *(struct s2 **)mem2;

如果内存块足够大以包含struct s2,这段代码是否能够在所有平台上运行? (例如由 malloc(sizeof(struct s2)) 分配)?

换句话说,重新解释包含指向 struct s1 的指针的内存单元是否正确(即可移植)?结构就好像它是一个指向 struct s2 的指针?

(免责声明:我完全意识到这是一种非常奇怪的使用指针的方式,我的问题是理论上的)

最佳答案

在 C 中,指针不需要具有相同的大小或表示形式。

这意味着 sizeof (int *) 可以与 sizeof (double *) 不同。

唯一的要求是:

  • void *char *signed char *unsigned char * 具有相同的表示。

  • 指向结构的指针具有相同的表示形式。

  • 指向 union 体的指针具有相同的表示形式。

关于c - 指向结构体和类型转换的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209234/

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