关于复合文字的问题

时间:2014-08-16 06:57:00

标签: c

复合立场:

#include<stdio.h>

struct s{
 int x;
 int y;
};

int main(){
 int j = 5;
 printf("\n &j : %p \n",&j);
 struct s *p = &(struct s){j++};
 printf("\n p : %p &j : %p x : %d y : %d \n",p,&j,p->x,p->y);
 return 0;
}

o/p:
-----
&j : 0x7fff416b74ec 
 p : 0x7fff416b74d0 &j : 0x7fff416b74ec x : 5 y : 0

a]为什么p不能保存j的地址?

b]为什么j不是对struct s进行类型转换?

4 个答案:

答案 0 :(得分:1)

声明

struct s *p = &(struct s){j++}; // compiler should raise a warning 

不完整。它应该像

struct s *p = &(struct s){.x = j++};  

struct s *p = &(struct s){.y = j++};  

未初始化的成员将由default设置为0

p不包含j地址的原因很明显p持有新对象(复合文字)的地址,而不是{{1}的地址本身。

答案 1 :(得分:1)

a)p不保存j的地址,因为p指向新创建的结构。 如果你愿意,那个p指向j,你应该写:

int * p = &j;

b)j是int local(stack)变量,所以我看不出来,它是如何被投射到结构中的。

@David C. Rankin,我改革了我的回答

答案 2 :(得分:0)

对于你的第一个问题,p是struct类型,j是整数类型,你必须使指针和相同数据类型的变量... 像int * p =&amp; j; //其中j是int类型。

答案 3 :(得分:-1)

j是整数类型(原始数据),你试图将它转换为复杂的数据类型(对象)..因此,你试图做装箱和拆箱..这不是c或c ++的概念......