C語言中typedef和sizeof的註意事項
typedef的作用是給一個數據類型起一個別名。
typedef struct LIST { int data; }SeqList;
SeqList 就相當於struct LIST,它具有定義變量的能力,和int,char的作用類似。
而
struct LIST{ int data; }SeqList2;
SeqList2就是一個變量,和int a;裏面的a的性質差不多。
當我們為結構體指針申請空間的時候,通常malloc裏面會使用sizeof運算符。那麽,sizeof裏面應該寫SeqList還是SeqList2呢?
我們不妨退一步想,為一個數組指針申請空間的時候,我們在sizeof裏面寫的是int,說明裏面填寫一個數據類型是不會錯的,所有使用malloc(sizeof(SeqList))是不會錯的。
但是,有時候,我們寫malloc((SeqList2)),運行的結果也是正確的,先看示例:
#include<stdio.h> #include<stdlib.h> struct LIST{ int data; }SeqList2; typedef struct LIST SeqList; SeqList *L,*L2; int main(int argc, char const *argv[]) { L = malloc(sizeof(SeqList)); L2 = malloc(sizeof(SeqList2)); printf("sizeof(L) = %d\n",sizeof(L)); printf("sizeof(L2) = %d\n",sizeof(L2)); return 0; }
運行結果:
sizeof(L) = 8 sizeof(L2) = 8
說明兩者申請到的空間是一樣的,說明在這個程序中,SeqList和SeqList2的作用效果是一樣的。下面研究一下sizeof。
#include<stdio.h> struct LIST{ int data; }SeqList2; typedef struct LIST SeqList; int main(int argc, charconst *argv[]) { printf("sizeof(SeqList) = %d\n",sizeof(SeqList)); printf("sizeof(SeqList2) = %d\n",sizeof(SeqList2)); return 0; }
運行結果:
sizeof(SeqList) = 4 sizeof(SeqList2) = 4
哎?這兩個東西大小是一樣的!
噢,原來sizeof計算的是對象所占的字節數。SeqList是一個數據類型,它默認占的字節數是4;而SeqList2是一個由SeqList數據類型定義的一個變量,它所占的字節數依舊是4。
那麽這意味著我們以後使用其中的任何一個就可以了嗎?
這次我們試驗一下,用SeqList數據類型定義一個結構體數組,看看會發生什麽變化:
#include<stdio.h> struct LIST{ int data; }SeqList2[2]; typedef struct LIST SeqList; int main(int argc, char const *argv[]) { printf("sizeof(SeqList) = %d\n",sizeof(SeqList)); printf("sizeof(SeqList2) = %d\n",sizeof(SeqList2)); return 0; }
運行結果:
sizeof(SeqList) = 4 sizeof(SeqList2) = 8
看看,不一樣了吧,原因是這個變量現在是一個數組,裏面有兩個元素,所占的字節數也增加了一倍,所以不是所有情況都可以混用的。
sizeof裏面最好還是統一使用數據類型比較放心。
如果還不熟悉typedef的具體作用或者不信服,下面在通過打印兩者的值看看有什麽不同:
#include<stdio.h> struct LIST{ int data; }SeqList2; typedef struct LIST SeqList; int main(int argc, char const *argv[]) { printf("sizeof(SeqList) = %d\n",sizeof(SeqList)); printf("SeqList = %d\n",SeqList); printf("sizeof(SeqList2) = %d\n",sizeof(SeqList2)); printf("SeqList2 = %d\n",SeqList2); return 0; }
現在編譯
C:\Users\zhaijiayu\code\data structure>gcc a.c a.c: In function ‘main‘: a.c:23:29: error: expected expression before ‘SeqList‘ printf("SeqList = %d\n",SeqList); ^
噢,出問題了,看看哪裏有問題?問題出在了SeqList上,前面說過,它是一個數據類型,不是變量,所以打印一個數據類型(和打印一個int相同),是有些荒謬的!
我們去掉這一句,看看有什麽變化:
#include<stdio.h> struct LIST{ int data; }SeqList2; typedef struct LIST SeqList; int main(int argc, char const *argv[]) { printf("sizeof(SeqList) = %d\n",sizeof(SeqList)); // printf("SeqList = %d\n",SeqList); printf("sizeof(SeqList2) = %d\n",sizeof(SeqList2)); printf("SeqList2 = %d\n",SeqList2); return 0; }
運行結果:
sizeof(SeqList) = 4 sizeof(SeqList2) = 4 SeqList2 = 0
編譯通過了!說明SeqList確實是一個數據類型,而SeqList2是一個變量,並且系統給它初始化的值為0.
C語言中typedef和sizeof的註意事項