C语言中的sizeof和strlen的区别

  • sizeof()
  • strlen
  • 大量案例(想深入了解可以看)
    • 1.(花括号int的sizeof())
    • 2.(花括号char的sizeof())
    • 3.(字符串char的sizeof()和strlen)
    • 4.(指针定义的sizeof()和strlen)
    • 5.(花括号二维数组int的sizeof())

sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别:

sizeof()

1. sizeof()【操作数所占空间的字节数大小】是一种c中的基本运算符。
可以以类型、指针、数组和函数等作为参数。
返回值类型为unsigned int

运算值在编译的时候就出结果,所以可以用来定义数组维数。

char a[5]="123";
int b=sizeof(a);//b=5
int c=strlen(a);//c=3

sizeof()是一种单目操作符,是用来计算你所使用的操作数所占的空间字节大小。

// 证明返回无符号整形案例:
int i=0;
int main(){i--;if(i>sizeof(i)){printf(">");}else{printf("<");}
}

结果是>
i在main函数里为-1,由于sizeof(int)是无符号整形,c语言发生隐式类型转换。会把-1直接看成有符号的数字,符号位会当做数字来算,是一个很大的值。

strlen

2.strlen()[计算字符串的长度]是一种函数。
'\0’作为终止符;
strlen的结果运行的时候才出来(不是编译期求值),是计算字符串长度的。
其参数必须是字符型指针(char*)。
头文件为#include<string.h>


size_t strlen(const char *str)//size_t()

以下是一些具体的实例(vs2013 设置为32位):

int main()
{char *p = "hello";char arr1 []= "hello";char arr2[] = { 'h', 'e', 'l', 'l', 'o' };printf("%d\n", sizeof( p));//结果4,因为指针变量的所占空间大小仅仅和操作系统位数有关32-4,64-8printf("%d\n", sizeof(arr1));//结果6,字符串默认以\0结尾,sizeof()包含\0的计算printf("%d\n", sizeof(arr2));//结果为5,因为为字符型表示,并不含有\0(仅仅字符串有\0)printf("%d\n", strlen( p));//结果为5,strlen求的是字符串的长度,不包含\0printf("%d\n", strlen(arr1));//结果为5,strlen求的是字符串的长度,不包含\0printf("%d\n", strlen(arr2));//因为字符型不包含\0,但字符串需要找到\0才可结束,所以在'o'之后继续向后读取直到找到\0,所以是一个随机值

结果如上;
设置为32位操作系统


(202011.01)后补一个注意事项:

#include <stdio.h>
int main()
{int arr[] = {1,2,(3,4),5};//整型数组printf("%d\n", sizeof(arr));return 0;
}


注意数组的数据类型,char只占一个字节,而int 数据类型四个字节哦,别忘了*4。前面的例子是char的。

#include <stdio.h>
int main()
{char arr[] = {1,2,(3,4),5};//字符型printf("%d\n", sizeof(arr));return 0;
}


大量案例(想深入了解可以看)

2020年11月19日补充:
补充几个题:

1.(花括号int的sizeof())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{int arr[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(arr)); // 16printf("%d\n", sizeof(arr + 0)); // 4 求 sizeof(int*)printf("%d\n", sizeof(*arr)); // 4, 求 sizeof(int)printf("%d\n", sizeof(arr + 1)); // 4, 求 sizeof(int*)printf("%d\n", sizeof(arr[1])); // 4, 求 sizeof(int)printf("%d\n", sizeof(&arr));// 4, 求 sizeof(int(*)[4]);printf("%d\n", sizeof(*&arr));// 16, 求 sizeof(int[4]);printf("%d\n", sizeof(&*arr));// 4, 求 sizeof(int*)printf("%d\n", sizeof(&arr + 1)); // 4, 求 sizeof(int(*)[4])printf("%d\n", sizeof(&arr[0])); // 4, 求 sizeof(int*)printf("%d\n", sizeof(&arr[0] + 1)); // 4, 求 sizeof(int*)system("pause");return 0;
}

花括号定义不带’\0’,所以求strlen就是未定义行为,所以就只有sizeof().

2.(花括号char的sizeof())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", sizeof(arr)); // 6, sizeof(char[6])printf("%d\n", sizeof(arr + 0)); // 4, sizeof(char*)printf("%d\n", sizeof(*arr)); // 1, sizeof(char)printf("%d\n", sizeof(arr + 1)); // 4printf("%d\n", sizeof(arr[1]));// 1, sizeof(char)printf("%d\n", sizeof(&arr));// 4, sizeof(char(*)[6])printf("%d\n", sizeof(*&arr)); // 6, sizeof(char[6])printf("%d\n", sizeof(&*arr));// 4, sizeof(char*)printf("%d\n", sizeof(&arr[1] + 1)); // 4, sizeof(char*)printf("%d\n", sizeof(&arr + 1)); // 4, sizeof(char(*)[6]);    system("pause");return 0;
}

花括号定义不带’\0’,所以求strlen就是未定义行为,所以就只有sizeof().

3.(字符串char的sizeof()和strlen)

char arr[] = "abcdef";printf("%d\n", sizeof(arr)); // 7, sizeof(char[7]);printf("%d\n", sizeof(arr + 0)); // 4, sizeof(char*)printf("%d\n", sizeof(*arr)); // 1, sizeof(char)printf("%d\n", sizeof(arr[1])); // 1, sizeof(char)printf("%d\n", sizeof(&arr[0] + 1)); // 4, sizeof(char*)printf("%d\n", sizeof(&arr)); // 4 sizeof(char(*)[7])printf("%d\n", sizeof(*&arr)); // 7 sizeof(char[7])printf("%d\n", sizeof(&*arr)); // 4 sizeof(char*)printf("%d\n", sizeof(&arr + 1)); // 4 sizeof(char(*)[7])printf("%d\n", strlen(arr)); // 6printf("%d\n", strlen(arr + 1)); // 5printf("%d\n", strlen(&arr + 1)); //类型不匹配printf("%d\n", strlen(&arr)); // 类型不匹配printf("%d\n", strlen(&arr[0])); // 6printf("%d\n", strlen(*&arr)); // 6printf("%d\n", strlen(&*arr)); // 6printf("%d\n", strlen(&arr[1] + 1));//4

strlen中类型不匹配是因为他们的数据类型不是char*.

4.(指针定义的sizeof()和strlen)

这个例题其实有点偏题了,涉及到指针和数组的隐式转化(感兴趣的可以去看我的博客–指针基础总结详解(里面有指针和数组的讲解))

char* p = "abcdef";printf("%d\n", sizeof(p)); // 4 sizeof(char*)printf("%d\n", sizeof(p + 1)); // 4 sizeof(char*)printf("%d\n", sizeof(*p)); // 1 sizeof(char)printf("%d\n", sizeof(p[0])); // 1 sizeof(char)printf("%d\n", sizeof(&p)); // 4 sizeof(char**)printf("%d\n", sizeof(&p[1] + 1)); // 4 sizeof(char*)printf("%d\n", sizeof(*&p)); // 4 sizeof(char*)printf("%d\n", sizeof(&*p)); // 4 sizeof(char*)printf("%d\n", strlen(p)); // 6printf("%d\n", strlen(p + 1)); // 5printf("%d\n", strlen(*p)); // 类型不匹配printf("%d\n", strlen(p[1])); // 类型不匹配printf("%d\n", strlen(&p)); // 类型不匹配. printf("%d\n", strlen(&p[1] + 1)); // 4printf("%d\n", strlen(*&p)); // 6printf("%d\n", strlen(&*p)); // 6

strlen中类型不匹配是因为他们的数据类型不是char*.

5.(花括号二维数组int的sizeof())

int arr[3][4] = { 0 };printf("%d\n", sizeof(arr)); // 48  sizeof(int[3][4])printf("%d\n", sizeof(arr[0])); // 16 sizeof(int[4])// arr[0] int[4], 再 + 1, 就把 int[4] 转成 int* 了printf("%d\n", sizeof(arr[0] + 1)); // 4 sizeof(int*)printf("%d\n", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4])printf("%d\n", sizeof(arr[0][0])); // 4 sizeof(int)printf("%d\n", sizeof(*arr[0])); // 4, sizeof(int)// arr 是二维数组 int[3][4] => int(*)[4] => * => int[4]printf("%d\n", sizeof(*arr)); // 16 sizeof(int[4])// arr + 1 => int(*)[4] => * => int[4]printf("%d\n", sizeof(*(arr + 1))); // 16 sizeof(int[4])// arr => int[3][4] => int(*)[4] => * => int[4] => +1 => int*printf("%d\n", sizeof(*arr + 1));// 4   arr[0] => int[4] => & => int(*)[4] => +1 => int(*)[4]printf("%d\n", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4])printf("%d\n", sizeof(*(arr[0] + 1)));// 4  arr[0] => int[4] => +1  => int*  => * => int

感觉有帮助可以点个赞,谢谢大家~

C语言中的sizeof()和strlen()的区别相关推荐

  1. C语言中sizeof与strlen的区别总结!

    C语言中sizeof与strlen区别总结! 先上一个例子: 结果: 一.sizeof与strlen char c[] = "abc\0cba"; 问题1:sizeof(c) = ...

  2. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

  3. c语言sizeof(test),解析C语言中的sizeof

    一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的 ...

  4. c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析

    对C语言中的sizeof的介绍分析 引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是百分网小编分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读! 1.定义 sizeof是C ...

  5. c语言中sizeof结构体,C语言中的sizeof用法

    C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么.我以前也有用错的时候,现在写一写,也算是提醒一下自己吧.反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞 ...

  6. C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程

    目录 一.sizeof 函数与 strlen 函数区别 1.获取字符串长度 – 针对字符串 2.获取指针/数组长度 – 针对指针/数组 3.sizeof 获取内存大小 4.经典案例 二.猜你喜欢 零基 ...

  7. Sizeof与Strlen的区别与联系(转)

    一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.     它的功能是:获得保证能 ...

  8. Sizeof与Strlen的区别与联系

    Sizeof与Strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小 ...

  9. C语言 - sizeof和strlen的区别

    sizeof和strlen的区别: 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.s ...

最新文章

  1. 推荐搜索系统论文干货集锦
  2. python过采样代码实现_过采样中用到的SMOTE算法
  3. SCOM2016 安装OS或应用管理包
  4. python英语翻译-python制作英语翻译小工具代码实例
  5. div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。
  6. webpack基础使用Loader(三)
  7. php抓取动态数据,php+ajax实现无刷新动态加载数据技术
  8. java中final注意的问题
  9. 解压deb_Linux填坑记:很全面的解压和压缩命令集合
  10. Java多线程学习十:线程池实现“线程复用”的原理
  11. input中autocomplete属性
  12. hadoop处理excel数据
  13. 安川ga700变频器故障码集_安川变频器故障代码
  14. 基于Arduino的多功能数字时钟
  15. 怎样可以促进睡眠质量?睡眠不好一定要知道这些方法
  16. 程序员网站有哪些?(欢迎补充)
  17. Java编程到底是用idea好还是eclipse好?
  18. php面试php数组变ahp,php实现把数组按指定的个数分隔
  19. php intval获取手机号,微信小程序获取微信绑定授权手机号getPhoneNumber
  20. 学计算机小升初,小升初微机派位什么意思

热门文章

  1. 易点租:企业融入“租”时代 谋求轻资产化高效运营
  2. jenkins 下Unable to produce a script file错误解决
  3. iOS开发- OC之富文本
  4. p6-day17 作业
  5. c语言fl,CFONST整合版_version_1.5_by_FL
  6. 无论是批八字还是起名
  7. SuperMap 二维数据建造三维模型
  8. 设计模式之行为模式中的模板方法模式(template method)
  9. 不敢辞职,不建议辞职,不能辞职
  10. 小程序毕设作品之微信二手交易小程序毕业设计成品(7)中期检查报告