sizeof和strlen的c 問題

2023-03-25 07:05:02 字數 3416 閱讀 7254

1樓:匿名使用者

sizeof計算出來的是所佔位元組數,strlen算出來的是字元數,不包括'\0'

a1[10]有10個char所佔的空間,char佔1個位元組,所以a1[10]佔10個位元組,但是只有4個字元。

a2沒有指定大小,大小是根據後面的元素個數自動計算的,所以是3;字元數也是3

a3也沒有指定大小,用乙個字串來初始化,字串都是以'\0'結尾的,因此字串"sdfg"裡面其實包含了's','d','f','g','0'5個字元,所以佔了5個位元組;但是strlen不計算'\0',所以是4個字元。

a4[4]同理,4個位元組,3個字元。

a5[4]同理,4個位元組,4個字元//

但是執行的時候是11個字元,這點我暫時沒明白。思考下,可能是這個原因:strlen的引數是字串,也就是必須到'\0'才結束。

a5裡面沒有'\0',因此strlen會往後找,直到找到'\0'為止。

void main()是可以的,用雙引號包含標頭檔案也是可以的。

2樓:匿名使用者

這是我執行出來的結果,有的地方不同電腦會不同,後面會提到。

sizeof是計算位元組數,字元變數是1個位元組,所以有幾個字元變數就是幾個位元組。

strlen是計算字串長度,不過字串末尾的\0是不會算進去的。

我逐一說吧。

對於a1,a1定義長度是10,所以佔位元組數也就是10,你初始化了4個元素,後六個就是0,也就是\0,因為\0的值就是0。所以a1作為乙個字串,實際是。

"abcd\0\0\0\0\0\0",所以字串長度是4。

對於a2,你用的是不說明陣列長度並且用逐一元素初始化的初始化方法,這樣你初始化了幾個元素,這個陣列的長度就是多少。所以長度是3,但是a2的3個元素都被佔滿了,沒有\0,所以作為字串來講編譯器找不到結束符,就會出現一些亂七八糟的東西,你可以用puts(a2)來檢視一下就知道了。不同電腦結果會不一樣。

對於a3和a4,用字串來初始化字元陣列的時候,只要長度足夠或者預設長度,編譯器會自動加上乙個\0做結束符。

a5和a2差不多,也是沒有\0導致的,同樣可以用puts(a5)來查詢。

所謂字串a,就是從a的位址開始往後,到第乙個\0之間的內容。

3樓:網友

strlen是計算從開始到'\0'之間的位元組數的,不包括尾部的那個結束符。

對a1求strlen是依賴編譯器把未指定的即從a[4]起元素置為0,否則肯定出錯。

而a2就遇到了這個問題,位元組流的莫非沒有0,strlen繼續跑,跑到a3**遇到0才停止。已經越界了。

a3就是編譯器給分配了足夠的容納字元的空間,以及,還有乙個額外的位元組容納0。

a4的寫法靠自己計算,參考a3就知道4位元組全用了。

a5那個和a2一樣越界了,但是究竟是在**遇到 0是不確定的,這種bug是程式崩潰的一種原因。

回頭說sizeof,這個是能夠在編譯時刻根據變數型別確定的實際儲存空間大小。

有的是你設定的,如明確給出陣列下標,有的是編譯器設定的,例如陣列不寫下標值而是根據初始元素的個數自動計算。

c語言中sizeof與strlen的區別是什麼

4樓:匿名使用者

一、指代不同。

1、sizeof:用於獲取字串的長度,是處理字串的重要工具。

2、strlen:所作的是乙個計數器的工作。

二、規則不同。

1、sizeof:可用於任何變數名、型別名或常量值,當用於變數名(不是陣列名)或常量時,不需要用圓括號。

2、strlen:從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃瞄,直到碰到第乙個字串結束符'\0'為止,然後返回計數器值。

三、用法不同。

1、sizeof:sizeof( type_name );sizeof( 型別 );編譯時起作用,而不是執行時。

2、strlen:extern unsigned int strlen(char *s);返回s的長度,不包括結束符null。

5樓:小丁創業

區別如下:

1、指代上的區別。

(1)sizeof:用來獲取字串長度的導引,是處理字串的重要工具。

(2)strlen:做的是乙個計數器。

2、用法上的區別。

(1)sizeof:sizeof( type_name );sizeof(type); 在編譯時有效,而不是在執行時有效。

(2)strlen:extern unsigned int strlen(char *s); 返回s的長度,不包含終止符null。

3、規則上的區別。

(1)sizeof:可用於任何變數名,型別名或常量值。 當用於變數名(不是陣列名)或常量時,不需要括號。

(2)strlen:從記憶體的某個特定位置開始掃瞄(可以是字串的開頭,中間的某個位置,甚至是不確定的儲存區域),直到第乙個字串結束字元'\ 0'為止 ,然後返回計數器值。

6樓:倒霉熊

sizeof獲得是所佔的位元組數,所分配的空間的位元組數。

strlen獲得是長度(實際字元的個數)。

例如: char a[5]="abc";

sizeof(a) 等於5,因為分配了5個位元組的空間。

而strlen(a)等於3,這是其實際字元的個數。

7樓:

sizeof 是被測試型別佔用位元組的大小。

strlen是以\0為結束符的字串的串長度(不含結束符)比如吧:

char *p = 0123456789abcdef";

char str = 0123456789abcdef";

char str2[100] =0123456789abcdef";

sizeof(p) 只是 4(或8與作業系統有關,32位系統應當只是4)

strlen(p) 是16個長度。

sizeof(str) 是17

strlen(str) 是16

sizeof(str2) 是100

strlen(str2) 是16

c語言sizeof和strlen的區別

8樓:匿名使用者

char name="nike" ;

sizeof(name)=5

如果陣列定義成int,就不能用scanf("%s",name);來輸入字串了,因為這兩個型別是不同的。%s只能輸入char字串資料。

9樓:網友

sizeof運算子計算的是運算元型別的大小,只是陣列會乘以長度而已,和傳入的具體內容無關。

要強行輸出5的話那就sizeof("nike")吧……

要強行可以計算補了0長度的那就strlen+1

10樓:萢萢

\0 只在char型陣列中才有。

c語言中strlen怎麼用,c語言strlen函式問題

strlen為c語言庫函式,包含於string.h中,作用為計算乙個字串 字元陣列 中元素的個數,即從陣列頭部計數,直到遇到字串結束符 0為止,計數結果不包括 0.其宣告為 unsigned int strlen char s 比如定義字串 char p this is for testing 呼叫...

c語言中sizeof的意思是什麼下面這道題的答案是什麼,請解

上面這麼多朋友都在亂說,不怕誤導別人啊?vc環境下的答案是124 tc環境下是64,因為int在vc下佔4位元組,而在tc下佔2位元組 sizeof struct date 12 year,month和day每個佔4位元組,所以結構體today佔用3 4 12位元組 sizeof m 4 a佔4位元...

sizeof計算虛函式和虛擬繼承類大小時的問題

這的確涉及了記憶體對齊,還有虛繼承vbptr指標,但是太複雜了,樓主弄明白了告訴我一聲。虛函式和虛繼承的大小問題 乙個簡單程式 我用的vc6,結果分別是8,20,32.a的大小為8的原因是位元組對齊,即虛函式表指標佔4位元組,k佔3位元組,然後編譯器補了1位元組,將類的大小湊成4的倍數,以方便32位...