成长 进步 分享

Great works are performed not by strength, but by perseverance

C语言:sizeof详解

C语言、嵌入式系统、liunx开发中,经常用到sizeof函数。这里就对sizeof做一个详细的说明。

sizeof基础

首先要说明的是,在C语言中,sizeof是一个操作符,而不是函数!它的作用是判断数据类型或者表达式的长度(所占内存字节)。

表达方式有两种:

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

通常使用第一种形式。

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

typedef unsigned int size_t;

首先来确定当前编译环境中C语言各个基本数据类型在内存中所占字节数,分别是32bit和64bit编译环境:

#include <stdio.h>

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

  return 0;
}

下面32bit环境的输出结果:

sizeof(char)  = 1
sizeof(short) = 2
sizeof(int)   = 4
sizeof(long)  = 4
sizeof(float) = 4
sizeof(double)= 8

下面64bit环境的输出结果:

sizeof(char)  = 1
sizeof(short) = 2
sizeof(int)   = 4
sizeof(long)  = 8
sizeof(float) = 4
sizeof(double)= 8

sizeof的典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个(注意考虑32bit环境和64bit环境的不同)

#include <stdio.h>

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

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

  return 0;
}

如果你都能答对的话,说明sizeof你已经掌握了。否则你还是需要好好学习的:)

下面是公布答案的时候
32bit环境:

sizeof(char) = 1
sizeof(char*)= 4
sizeof('a')  = 4
sizeof(*s+0) = 4
sizeof(*s)   = 1
sizeof(s)    = 4

64bit环境:

sizeof(char) = 1
sizeof(char*)= 8
sizeof('a')  = 4
sizeof(*s+0) = 4
sizeof(*s)   = 1
sizeof(s)    = 8

下面来一个简单分析

  1. sizeof(char) 的值为1。因为char类型数据在内存中占1字节。
  2. sizeof(char*)的值为4(8)。因为char*代表一个指针,在32(64)bit环境中为4(8)字节,也即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(8),同(2),此处s是一个指针,在32(64)bit环境中为4(8)字节,也即unsigned int的字节长度。

以上就是本次的分享,对于sizeof的更多信息,可以查看百度百科等,关于C语言的学习,也可以参考往期文章《如何学习C++》。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注