C語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別 - C語(yǔ)言零基礎(chǔ)入門教程

目錄

零基礎(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ì)輸出 12,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ù). . .
*/

二.猜你喜歡

  1. 安裝 Visual Studio
  2. 安裝 Visual Studio 插件 Visual Assist
  3. Visual Studio 2008 卸載
  4. Visual Studio 2003/2015 卸載
  5. 設(shè)置 Visual Studio 字體/背景/行號(hào)
  6. C 語(yǔ)言格式控制符/占位符
  7. C 語(yǔ)言邏輯運(yùn)算符
  8. C 語(yǔ)言三目運(yùn)算符
  9. C 語(yǔ)言逗號(hào)表達(dá)式
  10. C 語(yǔ)言自加自減運(yùn)算符(++i / i++)
  11. C 語(yǔ)言 for 循環(huán)
  12. C 語(yǔ)言 break 和 continue
  13. C 語(yǔ)言 while 循環(huán)
  14. C 語(yǔ)言 do while 和 while 循環(huán)
  15. C 語(yǔ)言 switch 語(yǔ)句
  16. C 語(yǔ)言 goto 語(yǔ)句
  17. C 語(yǔ)言 char 字符串
  18. C 語(yǔ)言 strlen 函數(shù)
  19. C 語(yǔ)言 sizeof 函數(shù)
  20. C 語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別

未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? C 語(yǔ)言 sizeof 和 strlen 函數(shù)區(qū)別

[喜歡(3)](javascript:?? [打賞](javascript:??

本文由博客 - 猿說編程 猿說編程 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容