C语言中sizeof与strlen的区别总结!
? ? ? ? ? ? ? ?C語言中sizeof與strlen區別總結!
先上一個例子:
結果:?
?
一、sizeof與strlen
char c[] = “abc\0cba”;
問題1:sizeof(c) = ?
問題2:strlen(c) = ?
問題3:執行free(c);之后會有什么后果?
解答1:8
解答2:3? ?(判斷字符串a的長度,這個長度不包括"\0")
解答3:段錯誤
二、 short a[100],sizeof(a)返回??
A 2 ? ? B 4 ? ? ? C 100 ? ? ? D 200 ? ? ? ?E 400?
答案:D
段錯誤:指訪問的內存超出了系統所給這個程序的內存空間。
匯編語言的程序設計是分4個段來設計的,即用來放數據的數據段DS,臨時存放數據的堆棧段SS、存放程序代碼的代碼段、存放附加數據的附加段,每一段的最大存儲空間為64KB,跳轉指令、程序調用指令在轉移到地址沒有超過64KB地址空間范圍的叫段內轉移,超出64KB地址空間范圍的叫段間轉移。這就是段內和段間的含義。?
三:下列程序在 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語言本身決定。?
四:sizeof與strlen的區別本質上而言:
不同點:
(1)sizeof是一個運算符,它用類型作為參數,而strlen只是C庫提供的一個函數,他用來計算以’/0’結果的字符串的長度,即它的參數只能是char*。
(2)strlen的結果要在運行的時候才能計算出來,是用來計算字符串的實際長度,而sizeof的結果是在編譯的時候就計算過的,是類型或變量占內存的大小。 注意:sizeof計算的是類型或者變量占內存的大小。
相同點:
(1)它們相同的地點就只是返回值,都是一個size_t類型的值。
總結
以上是生活随笔為你收集整理的C语言中sizeof与strlen的区别总结!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: #define与typedef的区别!
- 下一篇: GetMemeory(char *p);