1. 程式人生 > >C語言中typedef和sizeof的註意事項

C語言中typedef和sizeof的註意事項

isp sizeof spa 註意 list數據 對象 audio 應該 user

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, char
const *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的註意事項