【问题标题】:Structure pointer pointing to different structure instance指向不同结构实例的结构指针
【发布时间】:2014-12-30 18:26:47
【问题描述】:
struct first_struct
{
    int a;
    int b;
};

struct second_struct
{
    char d;
    int e;
};

struct second_struct second_ins = {'a',10};
struct first_struct first_ins = {20,12};



int main()
{
    struct second_struct *pointer = &first_ins;
    printf("%d\n",pointer->d);   
    return 0;
}

我得到了 20 的输出。基本上,我试图看看如果我声明一个结构指针,并尝试将它指向另一个结构的实例,我会得到什么结果。除了编译器对不兼容的指针类型发出警告外,它还可以正常构建和运行。 我试图了解编译器如何解释此操作。这不应该是未定义的,或者可能是,我只是对结果感到幸运。

【问题讨论】:

  • pointer->d*pointer 完全相同,因为它是结构中的第一个元素,所以可以正常工作。
  • second_struct 中的第一个元素是字符,first_struct 中是整数。所以,当我尝试打印 %d 时,它不应该抱怨吗?我想我不太明白你的评论。
  • 即使是指针->e 也能正常工作。
  • 你很幸运,d 和 e 之间的填充字节恰好为 0。你无法保证它们在任何地方都会为 0,甚至存在。
  • 您使用的值 '20' 适合 int 的第一个字节,所以当您通过第二个结构“看到”它时,第一个字节映射到结构的 int 的第一个字节,所以有用。尝试使用像 346 这样的值来看看会发生什么

标签: c pointers struct


【解决方案1】:

很可能两个结构具有相同的元素对齐方式:sizeof(first_struct) == sizeof(second_struct) 和:int e 在结构中的起始偏移量与:int b

换句话说,char d 在布局方面有效地存储为int。这在您的平台上只是一个幸运的巧合,并且无法移植。

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多