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, 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.

猜你喜欢

转载自www.cnblogs.com/zhaijiayu/p/9645982.html