日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言之sizeof與strlen的使用及區別_C 語言

作者:魏波- ? 更新時間: 2022-09-05 編程語言

先上一個例子:

結果:?

1、sizeof與strlen

char c[] = “abc\0cba”;

問題1:sizeof(c) = ?

問題2:strlen(c) = ?

問題3:執行free(c);之后會有什么后果?

解答1:8

解答2:3? ?(判斷字符串a的長度,這個長度不包括"\0")

解答3:段錯誤

2、short a[100],sizeof(a)返回??

A 2 ? ? B 4 ? ? ? C 100 ? ? ? D 200 ? ? ? ?E 400?

答案:D

段錯誤:指訪問的內存超出了系統所給這個程序的內存空間。

匯編語言的程序設計是分4個段來設計的,即用來放數據的數據段DS,臨時存放數據的堆棧段SS、存放程序代碼的代碼段、存放附加數據的附加段,每一段的最大存儲空間為64KB,跳轉指令、程序調用指令在轉移到地址沒有超過64KB地址空間范圍的叫段內轉移,超出64KB地址空間范圍的叫段間轉移。這就是段內和段間的含義。?

3、下列程序在32位 linux 或 unix 中的結果是什么?

void func(char *str)
{
	printf(" %d", sizeof(str));
	printf(" %d", strlen(str));
}
 
int main() 
{
	char a[] = "123456789";
	printf(" %d", sizeof(a));
	printf(" %d", strlen(a));
	func(a);
 
	getchar();
	return 0;
}

結果: 10 9 4 9

在C/C++里數組作為參數時傳遞的實際上是指向數組第一個元素的指針,因此sizeof(str)返回的是指針的大小,即4。所有的指針大小都是4。

下列程序在 64?位 linux 或 unix 中的結果是什么?

結果: 10 9 8?9

為什么在64位系統中指針的大小是8,而32位的卻是4??

64位系統,這個位數指的是CPU 里面的通用寄存器的數據寬度為64位,也就是說一個地址占二進制位數是64,所以sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8

32位系統,同理,他的一個地址占32位二進制空間,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4

其實明白了兩個系統的尋址原理就能明白,大體就是這個原因。地址跟系統有關,但是基本數據類型占的大小是由C語言本身決定。?

4、sizeof與strlen的區別本質上而言

不同點:

(1)sizeof是一個運算符,它用類型作為參數,而strlen只是C庫提供的一個函數,他用來計算以’/0’結果的字符串的長度,即它的參數只能是char*。

(2)strlen的結果要在運行的時候才能計算出來,是用來計算字符串的實際長度,而sizeof的結果是在編譯的時候就計算過的,是類型或變量占內存的大小。 注意:sizeof計算的是類型或者變量占內存的大小。

相同點:

(1)它們相同的地點就只是返回值,都是一個size_t類型的值。

原文鏈接:https://blog.csdn.net/weibo1230123/article/details/82822976

欄目分類
最近更新