指向结构和演员的指针

时间:2012-02-09 10:34:40

标签: c pointers

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的指针一样?

(免责声明:我完全清楚这是一种非常奇怪的指针玩法,我的问题是理论上的)

4 个答案:

答案 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);
  }
}