sizeof你真的弄明白了吗?来看看这个例子

sizeof基础

在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其有两种表达形式:

(1)sizeof(类型说明符) (2)sizeof 表达式

我们通常使用第(1)种形式。

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为:

typedef unsigned int size_t;

首先确定我们当前编译环境中C语言各个基本数据类型在内存中所占字节数,我这里是32bit编译环境:

#include <stdio.h>

int main(void)
{
    printf("sizeof(char)  = %u\n", sizeof(char)); 
    printf("sizeof(short) = %u\n", sizeof(short)); 
    printf("sizeof(int)   = %u\n", sizeof(int)); 
    printf("sizeof(long)  = %u\n", sizeof(long)); 
    printf("sizeof(float) = %u\n", sizeof(float)); 
    printf("sizeof(double)= %u\n", sizeof(double));

    return 0;
}

我们这里的输出结果为:

sizeof典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个:

#include <stdio.h>

int main(void)
{
    char *s = "hello";

    printf("sizeof(char) = %u\n", sizeof(char)); 
    printf("sizeof(char*)= %u\n", sizeof(char*)); 
    printf("sizeof('a')  = %u\n", sizeof('a')); 
    printf("sizeof(*s+0) = %u\n", sizeof(*s+0)); 
    printf("sizeof(*s)   = %u\n", sizeof(*s)); 
    printf("sizeof(s)    = %u\n", sizeof(s)); 

    return 0;
}

实际输出结果为:

简要分析:

简要分析:

(1)sizeof(char) 的值为1。因为char类型数据在内存中占1字节。

(2)sizeof(char*)的值为4。因为char*代表一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

(3)sizeof('a')的值为4。因为此处‘a’是独立存在的一个字符(没有赋值给其它变量),实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制为整数97。但是需要注意的是,若有如下定义:

char ch = ‘a’;

则此处ch的字节数sizeof(ch)的值为1,而不是4。

(4)sizeof(*s+0)的值为4,因为’h’+0 转化为int,占4字节。此处涉及到类型转换的问题。即不同类型的数据进行运算时,会首先转换成相同数据类型。转换规则为(图片来源于网络):

(5)sizeof(*s)的值为1,因为此处*s为字符串s的第1个字符‘h’(注意与第三点区分开来,这里是有用char来修饰的),所以所占字节长度为1。

(6)sizeof(s)的值为4,同(2),此处s是一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

End:以上就是本次的分享,如有错误,欢迎指出!欢迎转发

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刷题笔记

#000 Python 入门第一题通过扩展,学到了更多的知识

创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

7340
来自专栏前端桃园

async/await 原理及执行顺序分析

之前写了篇文章《这一次,彻底理解Promise原理》,剖析了Promise的相关原理。我们都知道,Promise解决了回调地狱的问题,但是如果遇到复杂的业务,代...

11420
来自专栏C语言及其他语言

time库函数总结

参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),timer=时间数值时,用于设置日历时间,time_...

7320
来自专栏刷题笔记

2-8 符号配对 (20 分)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

8030
来自专栏Opensource翻译专栏

C的巨大影响【Programming】

Command Line Heroes本季最后一期告诉我们一小群开源爱好者是如何改变世界的。

10100
来自专栏刷题笔记

c++11/14快速入门(一)实验楼学习笔记

从现在开始,你的脑子里应该树立 『C++ 不是 C 的一个超集』这个观念(而且从一开始就不是)。在编写 C++ 时,也应该尽可能的避免使用诸如 void* 之类...

3010
来自专栏Web技术布道师

php://output和php://stdout的区别

PHP包含了以php://开头的一系列输出输出流,如php://stdin, php://stdout等。今天查看代码时,忽然想到一个问题:php://outp...

7910
来自专栏诸葛青云的专栏

学习凭自学C语言能到达什么高度

拿我一个朋友的故事来讲,小滔作为非科班学金融的大学生,在大二的时候迷上了IT这个行业,于是准备转专业IT,说干就干,每次下课有时间小滔便去蹭课,没有蹭课的空闲时...

10820
来自专栏诸葛青云的专栏

C语言这么厉害,它自身又是用什么语言写的?

换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写的,到底是先有蛋还是先有鸡?

9620
来自专栏诸葛青云的专栏

c++和c语言之间有什么区别

  C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生于上个世纪60年代。由于它的设计有很多优点,多年以来深受广大程序设计人员的喜爱,并逐渐 淘汰了很多...

15830

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励