(一)結構體指針定義linux
今天上班寫了一段測試代碼,結果在linux下編譯出現段錯誤,剛開始一直找不到緣由,後來找了度娘才搞懂了。我先貼出來第一次寫的代碼以及gcc編譯器下報的錯誤:函數
#include<stdio.h> typedef struct { int a; char str; int b[5]; }St; int main() { St * Ds; Ds -> a = 5; Ds -> str = 'a'; Ds -> b[5] = 2; printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]); St Ea; Ea.a = 100; Ea.str = 'B'; Ea.b[1] = 6; printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[1]); return 0; }
在linux gcc編譯器下編譯沒有報錯可是執行程序出現段錯誤,報錯以下:測試
咱們能夠看到程序沒法執行,而只定義St Ea結構體,執行下面的代碼沒有錯誤,當兩個一塊兒寫時就出錯。而之定義執行St* Ds結構體指針時執行程序時結果正確,可是一樣會報段錯誤。所以在這裏咱們知道了St* Ds這個結構體指針應該有問題。spa
後來查找資料總算知道了錯誤的地方,結構體指針在定義時必定要給它分配內存,不過不分配內存那這個指針指向的內存就是不肯定的,gcc編譯器不容許這種狀況出現,所以就會報段錯誤。修改程序以下所示,顯示結果正常,注意代碼中紅色是修改過的程序:指針
#include<stdio.h> #include<stdlib.h> typedef struct { int a; char str; int b[5]; }St; int main() { St * Ds; Ds = (St *) malloc (sizeof(St)); Ds -> a = 5; Ds -> str = 'a'; Ds -> b[5] = 2; printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]); St Ea; Ea.a = 100; Ea.str = 'B'; Ea.b[1] = 6; printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[1]); return 0; }
編譯程序,結果以下所示:code
咱們看到程序編譯執行都正常。blog
在這裏咱們總結一下:從此在寫從c代碼時遇到指針的定義,必定要注意給它分配內存,若是不分配內存便會出錯,在這裏咱們給結構體指針分配內存有兩種方法,分別以下:內存
一、使用malloc給指針分配內存編譯器
St* Ds; Ds = (St*)malloc(sizeof(St));
二、使結構體指針指向一個已經定義了的機構體。以下所示io
St* Ds; St Str_A; Str_A.a = 0; Ds = &Str_A;
2、sizeof
sizeof的做用是在c語言中計算數據類型或者表達式所佔的內存大小,注意它不是函數,sizeof是在程序編譯時執行,而不是在等到程序執行時才執行。要使用sizeof須要包含添加頭文件#include<stdilb.h>
計算結構體等變量使用sizeof時要注意給這個變量加小括號,不加就會出錯;sizeof(變量);