结构体变量声明及初始化的的那些坑

1、结构体非指针变量的声明和初始化

 

0 错误 0警告

并且成功输出2018 7 10

----------------完美-------------------

 

2、结构体指针变量的声明和错误的初始化


惨不忍睹,很多新手都会犯的错误。

警告先不处理,看看错误,,

1、初始值设定的项太多,怕是有人会有很多疑问了,为什么呢?因为这是 结构体指针变量,其右边的值只是对指针赋值,并不是对结构体内部的变量赋值,

所以提示项过多。那么我们只留下一个项。如下图

错误是没有,但是警告有2个。

1、这里我们先撇开上面解释的结构体指针变量的思想,先以很多初学者错误的思维来看,他们看这个是声明了一个T 类型的 结构体指针变量today,然后对其初始化。

表面上看起来合情合理这句话。其实大错特错,再沿着新手思维,假设它就是是 声明并初始化

但是警告里面提示 间接寻址级别不同,这样说太官方了,应该说 类型不一样。一个是 T* -> 的类型,一个是 int 类型。当然是不行的。

而且右边的today 是什么鬼?用一个未声明的变量来给左边的today赋值,你总不能在肚子里面干掉生出来的你把, 因此错误。

接着看

没有错误和警告,再看运行

程序崩溃了,为什么,因为结构体指针初始化必须赋予一个有效地址,才能进行正常的操作,而不是给它个0,因此产生了莫名其妙的错误。

/*  2018年10月14日增改:结构体声明和定义其实就是在堆上申请一段连续内存,对结构体指针赋 0或NULL,是让其指向内存地址0X0000的地方。这里不可读不可写 */

示例如下

 (结构体指针正确初始化)代码附上:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef struct time{
 5     int year;
 6     int month;
 7     int day;
 8 }T;
 9 
10 int main(void){
11 
12 
13     T *today;
14 
15     today = (T *)malloc(100 * sizeof(T *));
16     today->year = 2018;
17     today->month = 7;
18     today->day = 10;
19     printf("%d %d %d\n",today->year,today->month,today->day);
20     
21     return 0;
22 }

 

 

 

 

 

转载于:https://www.cnblogs.com/Fsiswo/p/9291458.html

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值