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

目录

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

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

一.sizeof 函数与 strlen 函数区别

C 语言中,strlen 函数和 sizeof 函数都能获取字符串长度,但是两者之间到底有什么区别呢,下面我们一一道来;

1.获取字符串长度 – 针对字符串

sizeof 函数数获取的长度是整个内存大小的长度,返回的长度包括'\0'strlen 函数获取的长度以'\0'结尾,返回的长度不包括'\0'

a.获取常规字符串长度 – 使用 strlen 和 sizeof 都一样

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/char p[4] = "abc";
printf("字符串:%s   sizeof长度:%d\n", p, sizeof(p));
printf("字符串:%s   strlen长度:%d\n", p, strlen(p));
/*
输出:字符串:abc   sizeof长度:4
字符串:abc   strlen长度:3
*/

sizeof 求的是字符串在内存中的长度,所以它是加上最后的 '\0' 的,所以一般而言 sizeof 函数的长度会比 strlen 函数的长度多 1。

b.获取非常规字符串长度 – 使用 strlen 和 sizeof 不一样

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/char str[1char str[100] = {0};
strcpy(str, "abcd");
int str_len = strlen(str);
int str_size = sizeof(str);
printf("strlen(str) = %d\n", (str_len));
printf("sizeof(str) = %d\n", (str_size));
/*
输出:strlen(str) = 4
sizeof(str) = 100
*/

这个例子可以充分说明:strlen 计算的是字符串到'\0'位置的大小,sizeof 计算的字符串占的内存大小,这也是 strlen 函数和 [sizeof](https://www.codersrc.com/archives/7851.html) 不同之处;

2.获取指针/数组长度 – 针对指针/数组

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/char p1[] = "abcdefg"; //数组
printf("字符串:%s   sizeof长度:%d\n", p1, sizeof(p1));
printf("字符串:%s   strlen长度:%d\n", p1, strlen(p1));
printf("----------------------------\n");
char* p2 = "abcdefg"; //指针
printf("字符串:%s   sizeof长度:%d\n", p2, strlen(p2));
printf("字符串:%s   strlen长度:%d\n", p2, sizeof(p2));
/*输出:字符串:abcdefg   sizeof长度:8
字符串:abcdefg   strlen长度:7
----------------------------
字符串:abcdefg   sizeof长度:7
字符串:abcdefg   strlen长度:4*/

值得注意的是:指针占用的内存大小始终为 4 个字节;

3.sizeof 获取内存大小

strlen 函数只能计算字符串长度,sizeof能获取 int / float / bool / char 等等所有类型的内存占用大小,比如:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/printf("int=%d\nshort=%d\ndouble=%d\n", sizeof(int), sizeof(short), sizeof(double));
/*
输出:int=4
short=2
double=8
请按任意键继续. . .
*/

4.经典案例

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
void main()
{int arr[] = { 1, 2, 3 };printf("sizeof(arr) : %d\n",sizeof(arr));for (int i = 0; i < sizeof(arr); i++){printf("%d,", arr[i]);}printf("\n");system("pause");
}
/*
输出结果:sizeof(arr) : 12
1,2,3,-858993460,9697168,11737625,1,13017304,13018680,123799719,11735310,11735310,
请按任意键继续. . .
*/

是不是很懵逼,,除了会输出 123 以外,还会输出杂乱无章的数字,但一共是输出 12 个。因为数组的内存是动态分配的,到了元素 3 以后的元素都是新分配的,并不一定是空,随机数。

因为数组是一片连续的空间,有可能元素 3 的空间是有数据的,那么 C 语言会将其读取出来,当然是一些没有实际意义的杂乱无章的数字,但你不要想着去操作,否则可能导致数据错乱,所以有可能你运行好几次,后面的值都不会有变化。正确版本如下:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 sizeof 和 strlen 函数区别
//@Time:2021/06/03 07:40
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/int arr[] = { 1, 2, 3 };
printf("sizeof(arr)/sizeof(int) : %d\n", sizeof(arr) / sizeof(int));
for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d,", arr[i]);
}
/*
输出:sizeof(arr)/sizeof(int) : 3
1,2,3,
请按任意键继续. . .
*/

二.猜你喜欢

  1. 安装 Visual Studio
  2. 安装 Visual Studio 插件 Visual Assist
  3. Visual Studio 2008 卸载
  4. Visual Studio 2003/2015 卸载
  5. 设置 Visual Studio 字体/背景/行号
  6. C 语言格式控制符/占位符
  7. C 语言逻辑运算符
  8. C 语言三目运算符
  9. C 语言逗号表达式
  10. C 语言自加自减运算符(++i / i++)
  11. C 语言 for 循环
  12. C 语言 break 和 continue
  13. C 语言 while 循环
  14. C 语言 do while 和 while 循环
  15. C 语言 switch 语句
  16. C 语言 goto 语句
  17. C 语言 char 字符串
  18. C 语言 strlen 函数
  19. C 语言 sizeof 函数
  20. C 语言 sizeof 和 strlen 函数区别

未经允许不得转载:猿说编程 » C 语言 sizeof 和 strlen 函数区别

[喜欢(3)](javascript:😉 [打赏](javascript:😉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BugkuCTF-MISC题好多数值

RGB转换图片&#xff0c;python from PIL import Image 题目给出了一个1.txt 各行都是RGB值&#xff0c;通过后来的了解是RGB转换成图片&#xff0c;那么来分析一下&#xff0c;此文档一共61367行&#xff0c;有数值的一共61366行。 &#xff08;1&#xff09;通过txt文件行数…

数组的定义

1.相同的数据类型 2.可以通过下标访问

C语言 error C4996: This function or variable may be unsafe - C语言零基础入门教程

目录 一.error C4996 简介二.error C4996 解决办法 1.采用_s 结尾的安全版本2.去掉 visual studio “安全开发生命周期(SDL)检查”3.#pragma warning( disable : 4996)4._CRT_SECURE_NO_WARNINGS 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门…

【潜龙勿用】中国制造业数字化转型大潮下的冷思考

戳蓝字“CSDN云计算”关注我们哦&#xff01;自德国工业4.0理论问世至今&#xff0c;五载春秋匆匆即逝&#xff0c;此间围绕智能化、数字化、制造业转型升级的理论日新月异、层出不穷&#xff0c;颇有百家争鸣之势&#xff0c;其中不乏“超越工业4.0”、“工业5.0”乃至更高阶、…

数组的声明和创建

package com.wuming.struct;public class Demo07 {public static void main(String[] args) {int[] nums;//1.声明一个数组numsnew int[10];//2.创建一个数组//3.给数组元素赋值nums[0]1;nums[1]2;nums[2]3;nums[3]4;//计算所有元素的和int sum0;//获取数组长度&#xff1a;arr…

BugkuCTF-MISC题红绿灯

题目给出了一个gif 打开后发现是一个闪烁的红绿灯共1168帧 一帧一帧查看发现多数是红色和绿色&#xff0c;偶尔有黄色且&#xff08;每8个红绿后跟一个黄&#xff09; 可以推测红色和绿色对应二进制0和1&#xff0c;黄色作为分隔 这样第一个黄灯之前数值为01100110或10011001 …

BugkuCTF-MISC题虎符

补充&#xff1a; firework类型&#xff1a;1.处理firework标志的图像&#xff1b;2.常见图片解析&#xff1a;图层分解&#xff0c;帧分解 解题&#xff1a; 拿到一个wim文件&#xff0c;直接解压&#xff0c;也可以binwalk梭出来。得到两个文件夹&#xff0c;先看“左”。 …

教你前端input框只允许输入正整数

<input class"layui-input" οnkeyup"valuezhzs(this.value)" lay-verify"required|number" id"" name"" > <script type"text/javascript"> //转化正整数 function zhzs(value){ v…

云计算科普——入行半年,我这样看云计算

戳蓝字“CSDN云计算”关注我们哦&#xff01;前 言在今天&#xff0c;如果说对于云计算还一无所知&#xff0c;那可就真的out了。企业喊了这么多年的”上云运动“&#xff0c;那么云的本质到底是什么呢&#xff1f;从2006年云计算的概念被提出到今天&#xff0c;已经经过了十几…

手把手教你用java完成文件、图片下载

package Kj; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.zip.GZIPInputStream; /** * 下载 工具类 * * author wuming */ public class Demo1 {…

Python-PIL

PIL库是python里自带的库&#xff0c;用的最多的就是里面的Image方法了 讲讲最简单的Image知识&#xff1a; Image.open(‘xxx.jpg’)&#xff1a;它将会打开一张图片 Image.tell()&#xff1a;这是找到GIF的帧数 Image.seek()&#xff1a;这个代码为取当前帧数的照片 getpixe…

CloudNative时代践行DevOps躲坑指南

戳蓝字“CSDN云计算”关注我们哦&#xff01;2015年&#xff0c;谷歌成立了原生云计算基金会&#xff0c;标志着CloudNative时代的来临。它以容器化封装、自动化管理、面向微服务等特点&#xff0c;向人们展示了应用云化开发的新模式。在业界&#xff0c;DevOps全栈开发运维模式…

数组:三种初始化及内存分析

java内存分析&#xff1a; 1.堆&#xff1a;存放new的对象和数组 2.栈&#xff1a;存放进本变量类型 3.方法区&#xff1a;class、static package com.wuming.struct; public class Demo08 { public static void main(String[] args) { //静态初始化&#xff…

BugkuCTF-MISC题简单套娃

打开题目&#xff0c;是一个图片。 丢进010发现有两个jpg头 把第二个FFD8FFE0后面一起复制下来&#xff0c;另存为一个新的图片。 丢进StegSolve&#xff0c;发现别的图层存在flag。 点击下方的左右箭头变换&#xff0c; 若flag实在看不清&#xff0c;两张图放进Stegsolve的Ima…

资源 | Alibaba Cluster Data 开放下载:270 GB 数据揭秘你不知道的阿里巴巴数据中心...

戳蓝字“CSDN云计算”关注我们哦&#xff01;CSDN云计算授权转载自阿里系统软件技术作者&#xff1a;临石打开一篇篇 IT 技术文章&#xff0c;你总能够看到“大规模”、“海量请求”这些字眼。如今&#xff0c;这些功能强大的互联网应用&#xff0c;都运行在大规模数据中心上。…

数组下标越界及小结

package com.wuming.struct;public class Demo09 {public static void main(String[] args) {int[] a{1,2,3,4,5,6,7,8};for (int i 0; i <a.length; i) {//去掉&#xff0c;下标越界&#xff0c;数组下标为[0&#xff0c;length-1]System.out.println(a[i]);}} }1 2 3 4 5…

C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程

目录 一.strcpy_s 函数/strcpy 函数简介 1.strcpy 函数语法2.strcpy_s 函数语法 二.strcpy/strcpy_s 函数实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.strcpy_s 函数/strcpy 函数简介 1.strcpy函数语法 /* *描述&#xff1a;此类函…

BugkuCTF-MISC题可爱的故事

下载文件&#xff0c;打开两张图片 根据评论提示是原神里面的提瓦特字母 题目的提示说flag就藏在图片特殊文字里&#xff0c;还提到谷歌翻译&#xff0c;开始以为要把文字翻译成我们认识的&#xff0c;结果半天提取不出来文字&#xff0c;看了其他暗示&#xff0c;才知道这是类…

漫画:如何实现大整数相乘?(下)

戳蓝字“CSDN云计算”关注我们哦&#xff01;如何用程序实现大整数相乘呢&#xff1f;在上一篇文章 漫画&#xff1a;如何实现大整数相乘&#xff1f;&#xff08;上&#xff09; 当中&#xff0c;我们介绍了两种思路&#xff1a;1.像列竖式一样&#xff0c;把两整数按位依次相…

成员变量(全局变量)和局部变量区别

1.成员变量&#xff08;全局变量&#xff09;在类中&#xff0c;方法外&#xff0c;可用修饰符修饰 2.局部变量在方法中&#xff0c;不可用修饰符修饰