查看原文
其他

【编程练习04】容易出错的sizeof

正念君 嵌入式大杂烩 2021-01-31
常持正念方圆梦,不忘初心总是春。


sizeof的概念


在看练习之前先来看一看sizeof的概念。在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。


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

typedef unsigned int size_t;


在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的易错问题

请看代码:

#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’为int,占4个字节。此处'a'没有给变量赋值,实际上就是一个整型数,即此处‘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的字节长度。


使用sizeof运算符在求结构体的字节数时也是个易错的问题,请查看【易错】C语言结构体内存对齐问题


以上就是关于sizeof运算符易错的知识点,要注意区分哦。


推 荐 阅 读

智能桌面天气预报系统(一)

【2018年10月汇总】编程学习笔记

【本质】你知道C语言编译的过程吗?

【重要】数组与指针不等价

C语言指针变量的运算

震惊!世界上最帅的人来给我点赞了!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存