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
的指针一样?
(免责声明:我完全清楚这是一种非常奇怪的指针玩法,我的问题是理论上的)
答案 0 :(得分:2)
在C中,指针不需要具有相同的大小或表示。
这意味着sizeof (int *)
可能与sizeof (double *)
不同,例如。
唯一的要求是:
void *
,char *
,signed char *
和unsigned char *
拥有
相同的表示。
指向结构的指针具有相同的表示形式。
指向工会的指针具有相同的代表性。
答案 1 :(得分:0)
是的,你是对的。所有指针都具有相同的大小和结构。它们的区别仅在于编译器的“思想”。
答案 2 :(得分:0)
是的,这是可能的。
指针在其表示中只是一个包含任何数据类型的内存位置地址的整数。
答案 3 :(得分:0)
这在抽象一些数据时非常有用。你可以:
struct s1
{
char header[4];
int type;
char data_max[200];
};
struct s1_type1
{
char header[4];
int type;
char data_of_some_implementation[80];
char data_of_other_implementation[120];
};
然后像这样使用它
struct s1 data;
int nb = read(fd, &data, sizeof(data));
if (nb == sizeof(data))
{
if (data.type == 1)
{
do_something_special((struct s1_type1*)&data);
}
}