C/C++知识点之C语言中typedef和sizeof的注意事项
小标 2018-11-13 来源 : 阅读 863 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言中typedef和sizeof的注意事项,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言中typedef和sizeof的注意事项,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

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
#include
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
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
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
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
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/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程