1. 程式人生 > >面試常見題之sizeof與strlen的區別

面試常見題之sizeof與strlen的區別

     前段時間一直在忙論文和專利的事情,沒時間去看一些c++/資料結構等筆試面試要用的知識,雖說做科研一直用的是c語言,但是平時用的哪些知識太狹隘了,主要集中在一些聚類演算法上面,並沒有多少時間去探討一些c++/c底層的一些東西,現在馬上要找工作了,著手看了一些東西,現在和大家分享一下,當然,我不是計算機專業的,也不是軟體專業的,在敘述我的觀點的時候,難免會有一些描述不夠完整或者正確的地方,真心希望大家可以指點一下。

  從今天起呢 我儘量做到每天都更新我的部落格,寫不是目的,目的是和大家一起探討,探討才有進步嘛!

  sizeof和strlen的區別:

1 sizeof是運算子,而strlen是函式;

2 sizeof的用法是sizeof(引數),這個引數可以是陣列,指標,型別,物件,甚至是函式,其值在編譯的時候就計算好了,而strlen的引數必須是字元型指標(char*),其值必須在函式執行的時候才能計算出來;

3 sizeof的功能是獲得保證能容納實現的建立的最大物件的位元組的大小,而strlen的功能是返回字串的長度,切記這裡的字串的長度是包括結束符的;

4 當陣列作為引數傳遞給函式的時候,傳的是指標,而不是陣列,傳遞陣列的首地址;

看下面的例子:

char str[20] = "0123456789";
int a = strlen(str);
int b = sizeof(str);


則  a = 10;

      b = 20;

這個例子相信大家都能看明白,strlen返回的字串的長度,sizeof返回建立的最大物件的位元組的大小,因此a = 10,b = 20;

看第二個例子:

int fun(int arry[])
{
	return sizeof(arry);
}
void main()
{
	int arry[]={1,2,3,4,5};
	cout<<fun(arry);
}

則最後輸出的結果為多少呢?

正確的結果應該為4,而不是5,前面說了當一個數組作為引數傳遞給函式的時候,傳遞的是指標,而不是陣列,也就是說在上面的函式中,傳給函式的引數是一個指標,我們知道任何型別的指標的大小都是佔4個位元組,所以sizeof(arry)應該是4個位元組,故最後的結果應該是4

再看下面一個例子

char* str = "0123456789";
int a = sizeof(str);
int b = sizeof(*str);

a = 4;

b =1;
這個想必大家都明白了,sizeof(str),這個str是指標,而sizeof(*str)中的引數*str則是第一個字元,因此大小應該為1.