Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22576
  • 博文数量: 2
  • 博客积分: 48
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-11 16:05
文章分类

全部博文(2)

文章存档

2012年(1)

2011年(1)

我的朋友

分类: C/C++

2011-08-11 09:15:42

结构体成员的访问方式有两种,但这两种访问方式有什么区别一种没弄得很明白。昨天一同事编程的时候遇到这问题,发现自己在这个地方也不是特别清晰,所以就一起在gcc下测试了一下。程序代码如下:
 
#include
 
typedef struct YEAR_A_S
{
  int *year;
  int month;
  int *day;
}YEAR_A;
 
typedef struct TIME_B_S
{
  YEAR_A *my_year;
  int hour;
  int min;
  int sec;
}TIME_B;
 
int main()
{
  int thisyear = 2011;
  int mday = 11;
  TIME_B localtime = {{&thisyear,8,&mday},9,30,10};
  TIME_B *thistime = &localtime;
 
/*由于thistime与my_year都是结构体指针,所以访问他们的成员必须用"->"而不能用"." */
  printf("year value 1 = %d\n",thistime->my_year->year); 
/*localtime 是结构体实体,所以必须用"."访问他的成员*/
  printf("year value 2 = %d",localtime.my_year->year);
  pintf("min = %d\n",localtime.min);
/*变量thisyear在内存中的地址*/
  printf("thisyear addr = %p",&thisyear);
 
/*结构体thistime的指针成员my_year的成员day的值*/
  printf("day value = %p\n",&(thistime->my_year->day));
/*变量mday在内存中的地址*/
  printf("mday addr = %p",&mday);
  return 0;
}
 
运行结果:
year value 1 = 0x7db
year value 2 = 0x7db
min = 30
day value = 0x7fc4
mday addr = 0x7fffd9ab9fc4
 
    能编译通过,说明上述代码在语法上并没有错误,但我们发现打印的结果并不是我想想象的那样。0x7db为十进制的2011 ,第一句和第二句打印并没有输出year这个指针变量本身的值(内存地址),而是输出了year指向地址的变量的值,第四句打印的输出就更让我们看不懂了,这到底输出了什么的值?
    后来才发现,之所以会出现这种结果,是因为结构体的初始化有问题,编译的时候报了很多警告,将结构体初始化的警告去除后,所有的结果就都正常了。结构体的初始化修改成以下方式。
 24     YEAR_A localyear = {
 25         .year = &thisyear,
 26         .month = 8,
 27         .day = &mday
 28     };
 29     TIME_B localtime = {
 30         .my_year = &localyear,
 31         .hour = 9,
 32         .min = 30,
 33         .sec = 10
 34     };
运行结果:
year value 1 = 0x7fff212daf0c
year value 2 = 0x7fff212daf0c
min = 30
day value = 0x7fff212daf04
mday addr = 0x7fff212daf04
所以说,正确的初始化结构体是很重要的,不然就会发生不可预料的情况。而结构体成员的访问,需要看当前变量是结构体实体还是结构体指针,如果为结构体指针,则访问其成员必须用“->”,若为结构体实体,则访问其成员必须用“.”。
阅读(7650) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:内存分配——栈、堆、静态区、符号区等等

给主人留下些什么吧!~~