(一)結構體指針定義
今天上班寫了一段測試代碼,結果在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這個結構體指針應該有問題。
后來查找資料總算知道了錯誤的地方,結構體指針在定義時一定要給它分配內存,不過不分配內存那這個指針指向的內存就是不確定的,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; }
編譯程序,結果如下所示:
我們看到程序編譯執行都正常。
在這里我們總結一下:今后在寫從c代碼時遇到指針的定義,一定要注意給它分配內存,如果不分配內存便會出錯,在這里我們給結構體指針分配內存有兩種方法,分別如下:
1、使用malloc給指針分配內存
St* Ds; Ds = (St*)malloc(sizeof(St));
2、使結構體指針指向一個已經定義了的機構體。如下所示
St* Ds; St Str_A; Str_A.a = 0; Ds = &Str_A;
二、sizeof
sizeof的作用是在c語言中計算數據類型或者表達式所占的內存大小,注意它不是函數,sizeof是在程序編譯時執行,而不是在等到程序執行時才執行。要使用sizeof需要包含添加頭文件#include<stdilb.h>
計算結構體等變量使用sizeof時要注意給這個變量加小括號,不加就會出錯;sizeof(變量);