结构体成员的访问方式有两种,但这两种访问方式有什么区别一种没弄得很明白。昨天一同事编程的时候遇到这问题,发现自己在这个地方也不是特别清晰,所以就一起在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));
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) |