标签:变化 增加 统一 splay 默认 struct [] 定义 去掉
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.
标签:变化 增加 统一 splay 默认 struct [] 定义 去掉
原文地址:https://www.cnblogs.com/zhaijiayu/p/9645982.html