目錄
零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦 : C/C++ 學(xué)習(xí)目錄 >> C 語(yǔ)言基礎(chǔ)入門
一.sizeof 函數(shù)與 strlen 函數(shù)區(qū)別
在C 語(yǔ)言中,strlen 函數(shù)和 sizeof 函數(shù)都能獲取字符串長(zhǎng)度,但是兩者之間到底有什么區(qū)別呢,下面我們一一道來(lái);
1.獲取字符串長(zhǎng)度 – 針對(duì)字符串
sizeof 函數(shù)數(shù)獲取的長(zhǎng)度是整個(gè)內(nèi)存大小的長(zhǎng)度,返回的長(zhǎng)度包括'\0';strlen 函數(shù)獲取的長(zhǎng)度以'\0'結(jié)尾,返回的長(zhǎng)度不包括'\0';
a.獲取常規(guī)字符串長(zhǎng)度 – 使用 strlen 和 sizeof 都一樣
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
char p[4] = "abc";
printf("字符串:%s sizeof長(zhǎng)度:%d\n", p, sizeof(p));
printf("字符串:%s strlen長(zhǎng)度:%d\n", p, strlen(p));
/*
輸出:
字符串:abc sizeof長(zhǎng)度:4
字符串:abc strlen長(zhǎng)度:3
*/
sizeof 求的是字符串在內(nèi)存中的長(zhǎng)度,所以它是加上最后的 '\0' 的,所以一般而言 sizeof 函數(shù)的長(zhǎng)度會(huì)比 strlen 函數(shù)的長(zhǎng)度多 1。
b.獲取非常規(guī)字符串長(zhǎng)度 – 使用 strlen 和 sizeof 不一樣
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
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
*/
這個(gè)例子可以充分說明:strlen 計(jì)算的是字符串到'\0'位置的大小,sizeof 計(jì)算的字符串占的內(nèi)存大小,這也是 strlen 函數(shù)和 [sizeof](https://www.codersrc.com/archives/7851.html) 不同之處;
2.獲取指針/數(shù)組長(zhǎng)度 – 針對(duì)指針/數(shù)組
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
char p1[] = "abcdefg"; //數(shù)組
printf("字符串:%s sizeof長(zhǎng)度:%d\n", p1, sizeof(p1));
printf("字符串:%s strlen長(zhǎng)度:%d\n", p1, strlen(p1));
printf("----------------------------\n");
char* p2 = "abcdefg"; //指針
printf("字符串:%s sizeof長(zhǎng)度:%d\n", p2, strlen(p2));
printf("字符串:%s strlen長(zhǎng)度:%d\n", p2, sizeof(p2));
/*
輸出:
字符串:abcdefg sizeof長(zhǎng)度:8
字符串:abcdefg strlen長(zhǎng)度:7
----------------------------
字符串:abcdefg sizeof長(zhǎng)度:7
字符串:abcdefg strlen長(zhǎng)度:4
*/
值得注意的是:指針占用的內(nèi)存大小始終為 4 個(gè)字節(jié);
3.sizeof 獲取內(nèi)存大小
strlen 函數(shù)只能計(jì)算字符串長(zhǎng)度,sizeof能獲取 int / float / bool / char 等等所有類型的內(nèi)存占用大小,比如:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
printf("int=%d\nshort=%d\ndouble=%d\n", sizeof(int), sizeof(short), sizeof(double));
/*
輸出:
int=4
short=2
double=8
請(qǐng)按任意鍵繼續(xù). . .
*/
4.經(jīng)典案例
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
#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");
}
/*
輸出結(jié)果:
sizeof(arr) : 12
1,2,3,-858993460,9697168,11737625,1,13017304,13018680,123799719,11735310,11735310,
請(qǐng)按任意鍵繼續(xù). . .
*/
是不是很懵逼,,除了會(huì)輸出 1,2,3 以外,還會(huì)輸出雜亂無(wú)章的數(shù)字,但一共是輸出 12 個(gè)。因?yàn)閿?shù)組的內(nèi)存是動(dòng)態(tài)分配的,到了元素 3 以后的元素都是新分配的,并不一定是空,隨機(jī)數(shù)。
因?yàn)閿?shù)組是一片連續(xù)的空間,有可能元素 3 的空間是有數(shù)據(jù)的,那么 C 語(yǔ)言會(huì)將其讀取出來(lái),當(dāng)然是一些沒有實(shí)際意義的雜亂無(wú)章的數(shù)字,但你不要想著去操作,否則可能導(dǎo)致數(shù)據(jù)錯(cuò)亂,所以有可能你運(yùn)行好幾次,后面的值都不會(huì)有變化。正確版本如下:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個(gè)人博客地址): www.codersrc.com
//@File:C語(yǔ)言教程 - C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
//@Time:2021/06/03 07:40
//@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!
/******************************************************************************************/
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,
請(qǐng)按任意鍵繼續(xù). . .
*/
二.猜你喜歡
- 安裝 Visual Studio
- 安裝 Visual Studio 插件 Visual Assist
- Visual Studio 2008 卸載
- Visual Studio 2003/2015 卸載
- 設(shè)置 Visual Studio 字體/背景/行號(hào)
- C 語(yǔ)言格式控制符/占位符
- C 語(yǔ)言邏輯運(yùn)算符
- C 語(yǔ)言三目運(yùn)算符
- C 語(yǔ)言逗號(hào)表達(dá)式
- C 語(yǔ)言自加自減運(yùn)算符(++i / i++)
- C 語(yǔ)言 for 循環(huán)
- C 語(yǔ)言 break 和 continue
- C 語(yǔ)言 while 循環(huán)
- C 語(yǔ)言 do while 和 while 循環(huán)
- C 語(yǔ)言 switch 語(yǔ)句
- C 語(yǔ)言 goto 語(yǔ)句
- C 語(yǔ)言 char 字符串
- C 語(yǔ)言 strlen 函數(shù)
- C 語(yǔ)言 sizeof 函數(shù)
- C 語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? C 語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別
[喜歡(3)](javascript:?? [打賞](javascript:??
本文由博客 - 猿說編程 猿說編程 發(fā)布!