C-sizeof和strlen区别,以及sizeof如何计算结构体大小
sizeof和strlen区别
- sizeof是关键字,在编译时就能计算出值,可以计算任何类型
- strlen是函数,只有在运行时才能去计算,且只能计算字符型的.
对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间
示例如下:
char buf1[]="abcde";
char buf2[]="ABC";
printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1));
printf("buf2: %d %d\n",sizeof(buf2),strlen(buf2));
打印如下:
 
可以看到当我们的buf1没有指定长度时,sizeof打印的是6,这是因为它把’\0’也包含进去了.
sizeof还可以计算类型大小,一般对于32位C程序而言,对应的long则为4字节
如下图所示:
 
示例:
printf("char: %d\n",sizeof(char));
printf("short: %d\n",sizeof(short));
printf("int: %d\n",sizeof(int));
printf("long: %d\n",sizeof(long));
printf("long long: %d\n",sizeof(long long));
printf("float: %d\n",sizeof(float));
printf("double: %d\n",sizeof(double));
打印如下:
 
sizeof计算结构体大小
计算机为了加快取读结构体的内容速度,所以会对结构体进行字节对齐.
字节对齐的规律就是:结构体大小必须是最大成员的倍数(方便寻址)
示例1:
struct TestA{
  short a;
  long b;    //b=4, a=1,而5%4=1,所以会在a上面补齐3字节,所以s1=8
};
struct TestB{
  char c;
  TestA d;
  int f;    //c=1,d=8,f=4,而1+8+4=13,13%8=5,还差3字节,所以会在c上面补齐3字节, s2=16
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}
打印如下:

示例2:
struct TestA {
  short a;
  long b;    //s1=8,之前已经分析过
};
struct TestB{
  char c;
  TestA d;
  long long f;    //c=1,s1=8,f=8,由于8最大,且17%8=1,所以会在c上面补齐7字节,则s2=24
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}
打印如下:

C-sizeof和strlen区别,以及sizeof如何计算结构体大小的更多相关文章
- sizeof 和 strlen 区别
		Sizeof与Strlen的区别与联系 一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ... 
- sizeof和strlen区别(转)
		char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int ... 
- C语言中sizeof与strlen区别
		本文转载自:http://www.2cto.com/kf/201109/105100.html 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc& ... 
- C语言各类型大小,结构体大小 sizeof(struct A)
		C语言类型大小总览 编译器pack指令 #pragma pack(n)——定义n字节对齐 C++固有类型的对齐取编译器对齐与自身大小中较小的一个 32位C++默认8字节对齐.gcc编译器默认4字节对齐 ... 
- sizeof求结构体大小
		1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ... 
- sizeof和strlen()区别及用法
		//sizeof是以字节为单位计算变量或类型所占内存大小,它是属于C语言运算符系列:而strlen()是一个函数,是计算字符串长度(也是以字节为单位,但略有区别):比如: char array[] = ... 
- sizeof和strlen()区别
		sizeof关键字和strlen()标准函数都可以用来测试字符串的长度,但是两者有很大的不同 sizeof只能在本函数内, 使用""和不指定长度的字符数组中才能测出字符串的真实长度 ... 
- sizeof和strlen区别
		sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等 数组:编译时分配的空间大小 指针:指针所占的空间, ... 
- 我也介绍下sizeof与strlen的区别
		本节我也介绍下sizeof与strlen的区别,很简单,就几条: 1. sizeof是C++中的一个关键字,而strlen是C语言中的一个函数:2. sizeof求的是系统分配的内存总量,而strle ... 
随机推荐
- 【记录】Windows 操作系统常用快捷命令
			https://www.lifewire.com/command-line-commands-for-control-panel-applets-2626060 打印机 control pr ... 
- SpringMvc 中的实用工具类介绍(包括 ResponseEntity、 RestTemplate、WebUtils 等)
			此部分内容将包含 ResponseEntity. RestTemplate.WebUtils 等 1. ResponseEntity ① Sprring Mvc 中作为方法的返回值使用法 @Reque ... 
- 四、蛋炒饭(Egg fried rice)
			蛋炒饭,是一种常见菜肴.最早的记载见于1972年湖南长沙马王堆汉墓出土的竹简上有关"卵火高"的资料.经专家考证,"卵熇"是一种用黏米饭加鸡蛋制成的食品.有人推断 ... 
- Super Jumping! Jumping! Jumping! ---HDU - 1087
			Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ... 
- php 跨数据库调取数据
			我的这个是thinkphp,我就在 Application -> Common -> Conf -> config.php 文件里面配置数据库的地方,加入了下面这段代码 //'数据库 ... 
- js深度复制三种方法
			1.用递归的方式进行深度复制 2.用JSON.stringify加上JSON.parse()进行深度复制 3.用jquery中自带的方法$.extend()进行深度复制 具体实现代码可百度自行查询 
- JS闭包解析
			三点注意事项 JS作用域传送门 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域). JS中的作用域链,内部的作用域可以访问到外部作用域中的变量和方法,而外部作用域不能访问内部作用域的变量和 ... 
- [Swift]LeetCode161. 一次编辑距离 $ One Edit Distance
			Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串S和T,确定它们是否都是是一 ... 
- zuul进阶学习(二)
			1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ... 
- 目标文件去除header一行开头的#号
			请按照如下步骤进行配置: --> 打开session的Config Object选项卡,并编辑Custom Properties选项 --> 编辑Custom Properties项目 ... 
