1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

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;
}


我们这里的输出结果为:

C语言 | 一个例子带你真正认清sizeof_编程开发

sizeof典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个C语言 | 一个例子带你真正认清sizeof_编程开发_02


#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;
}


实际输出结果为:

C语言 | 一个例子带你真正认清sizeof_编程开发_03

你懵了吗?没懵的话算我输C语言 | 一个例子带你真正认清sizeof_编程开发_04

C语言 | 一个例子带你真正认清sizeof_编程开发_05

简要分析:

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

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

(3)​​sizeof('a')​​的值为4。因为此处‘a’是独立存在的一个字符(没有赋值给其它变量),实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制为整数97。(貌似解释得有些牵强,但事实就是这样C语言 | 一个例子带你真正认清sizeof_编程开发_04)但是需要注意的是,若有如下定义:

char ch = 'a';

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

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

C语言 | 一个例子带你真正认清sizeof_C语言_07

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

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

End:以上就是本次的分享,如有错误,欢迎指出!欢迎转发、下载、收藏、点赞C语言 | 一个例子带你真正认清sizeof_编程开发_08C语言 | 一个例子带你真正认清sizeof_编程开发_08

猜你喜欢:

​一道简单但易错的C语言面试题​

​把notepad++配置成一个能编译C代码的记事本​

经典问题:return不可返回指向栈内存的指针!

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!