在结构中如何存储价值?

时间:2013-08-13 14:38:20

标签: c compiler-construction structure

如果有结构说

struct first
{
   int a;
   int b;
 };

现在如果我创建它的对象

int main(){
struct first ob1,ob2;

ob1.a=5;
printf("%u  %u",&ob1,&(ob1.a));  //prints same address
printf("%d  %d",ob1,(ob1.a)); //  5,garbage value
return 0;}

我的教授说ob1是指向结构的指针。我想知道ob1和ob1.a的地址是什么,它们存储的是什么价值?

同样在c ++中,我们有 this pointer 来为ob1.a和ob2.a赋值。在C中,编译器如何知道存储值的对象?

2 个答案:

答案 0 :(得分:3)

ob1绝不是指针。这是一种结构。

由于astruct first的第一个字段,&ob1&ob1.a是相同的地址(但具有不同的类型)。

在C中,编译器知道要存储哪个对象,因为你必须告诉它。在您的情况下,您分别说过ob1.aob2.a

编辑说明:使用%p打印指针,不要试图将结构传递给printf

答案 1 :(得分:2)

这一行引发了未定义的行为,因为printf期望第一个参数是int,但是你传递了一个包含两个整数的struct

printf("%d  %d",ob1,(ob1.a)); //  5,garbage value

它在你的情况下打印5和垃圾值的原因是你的编译器如何将参数传递给函数:它将ob1的副本放在堆栈上,然后是ob1的副本。一个。由于a是第一个字段,因此在堆栈上推送ob1相当于在堆栈上首先推送ob1.a然后推送ob1.b。因此上面的printf相当于:

printf("%d  %d", ob1.a, ob1.b, ob1.a); //  5,garbage value

因此,打印的第一个值是5,这是为ob1.a提供的值,后面是ob1.b中发生的任何垃圾。

毋庸置疑,在另一个系统或其他编译器上,您可以看到完全不同的东西。