sizeof和strlen的区别
一.一些廢話
關(guān)于sizeof和strlen這兩者的區(qū)別之前自己也是模糊不清,分不清誰(shuí)的計(jì)算結(jié)果包含\0,誰(shuí)的計(jì)算結(jié)果不包含\0,因此寫(xiě)下自己的一些理解,有錯(cuò)誤的地方希望大家指出。
二.一些理論
首先,sizeof它是一個(gè)關(guān)鍵字而不是函數(shù),sizeof(int)和sizeof int,這兩個(gè)計(jì)算的結(jié)果在32位系統(tǒng)下面結(jié)果都是4,一個(gè)有(),一個(gè)沒(méi)有(),而我們都知道,函數(shù)都是帶()的,因此sizeof不是函數(shù),而是關(guān)鍵字。相反strlen是函數(shù)。strlen()用于計(jì)算字符串中字符的數(shù)目(也就是字符長(zhǎng)度,以字符為單位給出字符串長(zhǎng)度,但是一個(gè)字符占用一個(gè)字節(jié)),當(dāng)它遇到\0時(shí)候就會(huì)停止,因此它計(jì)算的結(jié)果中并不包括\0在內(nèi)。而sizeof關(guān)鍵字計(jì)算得是在內(nèi)存中占用的空間,在我們初始化字符數(shù)組時(shí)候編譯器會(huì)在后面自己加上\0,因此sizeof在計(jì)算時(shí)候它的結(jié)果將\0包含在內(nèi)。
strlen既然是函數(shù),就必然涉及到參數(shù)的問(wèn)題,他的參數(shù)是指針,在VC++6.0中,原型為size_t strlen(const char *string);傳遞的值可以是個(gè)指針也可以是個(gè)數(shù)組名(其實(shí)數(shù)組名也是一個(gè)地址),以下是百度百科的解釋:strlen所作的僅僅是一個(gè)計(jì)數(shù)器的工作,它從內(nèi)存的某個(gè)位置(可以是字符串開(kāi)頭,中間某個(gè)位置,甚至是某個(gè)不確定的內(nèi)存區(qū)域)開(kāi)始掃描,直到碰到第一個(gè)字符串結(jié)束符'\0'為止,然后返回計(jì)數(shù)器值(長(zhǎng)度不包含'\0')。
三.代碼說(shuō)明
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *str = "ABCDEFGH";
char arr[] = "ABCDEFGH";
int len = 0;
int len_1 = 0;
int len_2 = 0;
int len_3 = 0;
len = strlen(str);
len_1 = sizeof(arr);
len_2 = strlen(arr);
len_3 = sizeof(str);
printf("len = %d\n", len);
printf("len_1 = %d\n", len_1);
printf("len_2 = %d\n", len_2);
printf("len_3 = %d\n", len_3);
return 0;
}
輸出結(jié)果:len = 8
? ? ? ? ? ? ? ? ? len_1 = 9
? ? ? ? ? ? ? ? ? len_2 = 8
len_3 = 4
分析:首先定義了一個(gè)指向字符類(lèi)型的指針,并初始化:char *str = "ABCDEFGH";這個(gè)時(shí)候編譯器會(huì)在字符串后面自動(dòng)加上\0。
? ? 其次定義了一個(gè)字符數(shù)組,并初始化:char arr[] = "ABCDEFGH";注意此時(shí)我們并沒(méi)有指定數(shù)組大小,但是我們聰明的編譯器會(huì)根據(jù)字符數(shù)自主決定他的大小,并在后面加上\0。因此大家不要誤以為數(shù)組的大小不確定。所以根據(jù)sizeof來(lái)計(jì)算,它們兩者占用的內(nèi)存空間都是9字節(jié),strlen計(jì)算得到的字符數(shù)都是8個(gè)字符。然后sizeof(str),這是計(jì)算類(lèi)型大小的經(jīng)典應(yīng)用,在32位系統(tǒng)下,指針都是占4個(gè)字節(jié)的空間。
四.拓展一下
如果將char *str = "ABCDEFGH";和char arr[] = "ABCDEFGH";改為下面的形式呢?
char str[8] = "ABCDEFGH";
char arr[8] = "ABCDEFGH";
計(jì)算的結(jié)果又是多少?
分析一下:strlen(str)等于多少?strlen(arr)等于多少?sizeof(str)和sizeof(arr)又等于多少?
Dev-C++5.2.0.3編譯運(yùn)行得到的結(jié)果為:len = 8, len_1 = 8,? len_2 = 16, len_3 = 8.
不同的編譯器會(huì)有不同的處理方式,大家遇到類(lèi)似問(wèn)題時(shí)候還是要以\0的位置為準(zhǔn)。
轉(zhuǎn)載于:https://www.cnblogs.com/timemachine213/p/8321164.html
總結(jié)
以上是生活随笔為你收集整理的sizeof和strlen的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第十二天Python学习记录
- 下一篇: linux 无外网情况下安装 mysql