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

一、結構體非指針變量的聲明和初始化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 }
相關文章
相關標籤/搜索