結構體變量聲明及初始化的的那些坑


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 }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM