一、結構體非指針變量的聲明和初始化spa
0 錯誤 0警告3d
而且成功輸出2018 7 10 指針
----------------完美-------------------code
二、結構體指針變量的聲明和錯誤的初始化blog
慘不忍睹,不少新手都會犯的錯誤。內存
警告先不處理,看看錯誤,,io
一、初始值設定的項太多,怕是有人會有不少疑問了,爲何呢?由於這是 結構體指針變量,其右邊的值只是對指針賦值,並非對結構體內部的變量賦值,class
因此提示項過多。那麼咱們只留下一個項。以下圖 變量
錯誤是沒有,可是警告有2個。程序
一、這裏咱們先撇開上面解釋的結構體指針變量的思想,先以不少初學者錯誤的思惟來看,他們看這個是聲明瞭一個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 }