1

如果 a 有结构说

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++ 中,我们有这个指针来为 ob1.a 和 ob2.a 赋值。在 C 中,编译器如何知道在哪个对象中存储值?

4

2 回答 2

3

ob1绝不是指针。它是一个结构。

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

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

编者按:用于%p打印指针,并且根本不要尝试将结构传递给printf

于 2013-08-13T14:41:05.993 回答
2

此行会引发未定义的行为,因为printf期望第一个参数是 anint但您传入的 astruct包含两个整数:

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

在您的情况下它打印5和垃圾值的原因是因为您的编译器如何将参数传递给函数:它将副本ob1放在堆栈上,然后是 ob1.a 的副本。既然a是第一个字段,ob1那么压栈就相当于先压栈ob1.aob1.b压栈。因此,printf上述等价于:

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

因此,打印的第一个值是 5,这是为 赋予的值ob1.a,然后是恰好在 中的任何垃圾ob1.b

不用说,在另一个系统上,或者使用另一个编译器,你会看到完全不同的东西。

于 2013-08-13T14:59:44.133 回答