sizeof strlen() char * char []

源地址:http://hi.baidu.com/qingb087/blog/item/53a42baeecb383c47dd92a6e.html

sizeof 是C的一個運算符,它用來計算數據類型或對象的大小(佔內存空間的字節數)它的值在編譯時就決定,因此由它計算的變量或類型所佔內存空間的大小在編譯時就應當是確定的(靜態的) 
strlen 是C的一個標準庫函數,用來計算字符串的長度,它的值在運行是確定,因此由它計算的字符串長度可以是動態的也可以是靜態的。 
strlen的參數是char *類型,它計算字符串的長度直到遇到\0爲止,且長度不包含\0。當用一個字符數組做位strlen參數時,數組名會隱式的轉化爲char *. 
sizeof是計算的變量,類型所佔空間的大小,當然包含\0. 

sizeof例題 
char *str1="absde"; 
char str2[]="absde"; 
char str3[8]={'a',}; 
char str4[] = "0123456789"; 

sizeof(str1)=4 
sizeof(str2)=6; 
sizeof(str3)=8; 
sizeof(str4)=11 
首先說明一點,char類型佔一個字節,所以sizeof(char)是1,這點要理解 

str1是一個指針,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串佔的空間也不是字符數組佔的空間,而是一個字符型指針佔的空間。所以sizeof(str1)=sizeof(char*)=4,在32位體系結構的計算機中,一個指針佔4個字節 

str2是一個字符型數組。C/C++規定,對於一個數組,返回這個數組佔的總空間,所以sizeof(str2)取得的是字符串"absde"佔的總空間。"absde"中,共有a b s d e \0六個字符,所以str2數組的長度是6,所以sizeof(str2)=6*sizeof(char)=6 

str3已經定義成了長度是8的數組,所以sizeof(str3)爲8 

str4和str2類似,'0' '1' ... '9'加上'\0'共11個字符,所以str4佔的空間是11

總之,對於指針,sizeof操作符返回這個指針佔的空間,一般是4個字節;而對於一個數組,sizeof返回這個數組所有元素佔的總空間。char*與char[]容易混淆,一定要分清,而且char*="aaa"的寫法現在不被提倡,應予以避免 
而strlen不區分是數組還是指針,就讀到\0爲止返回長度。而且strlen是不把\0計入字符串的長度的。 
char * p="aaa"這種寫法很具有迷惑行,p只是一個字符串指針而已,他沒有分配什麼裝"aaa"內存,只是指向裝有“aaa”的內存而已。char p[]="aaa"則分配了內存,所以說字符串指針跟數組名是不一樣的,數組名可以隱式的轉化位字符串指針,但是反過來是不行的。 


看下面的程序 : 
#include<iostream.h> 
char* name() 

char name[8]="windows"; 
return name; 

void main() 

cout<<name()<<endl; 

但是這樣就能夠正常輸出 : 
#include<iostream.h> 
char* name() 

char *name="windows"; 
return name; 

void main() 

cout<<name()<<endl; 

爲什麼,謝謝!!   
char name[8] 是字符數組,是一個局部變量,“windows”這個字符常量初始化了它。局部變量是分配在棧上的,當函數退出時,它就被釋放了。當return name,返回數組的指針(第一個元素的指針,是一個常量)時,此時name所指的空間已經釋放了,name是無效的,這樣也是危險的。 
char *name是一個字符串指針,也是一個局部變量,“windows”這個字符常量用它的指針初始化了它。關鍵就在字符常量的空間是分配在全局數據區的,也就是說它用一個指向全局數據區的指針初始化了name,所以即使函數退出,那麼所指向的空間還是有效的。 
如果要想返回一個字符串的指針,一種辦法就是動態的分配一個內存,然後把要返回的字符串拷貝到這塊內存上即可。













補充,來源:http://topic.csdn.net/u/20120213/21/ddff5845-8af5-4e97-9380-4e36ce55ddff.html  8樓

sizeof Operator

sizeof expression

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type  
(including aggregate types). This keyword returns a value of type size_t.

The expression is either an identifier or a type-cast expression (a type specifier enclosed in  
parentheses).

When applied to a structure type or variable, sizeof returns the actual size, which may include  
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof  
returns the size of the entire array. The sizeof operator cannot return the size of dynamically  
allocated arrays or external arrays.

1.sizeof操作符的結果類型是size_t,它在頭文件中typedef爲unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。
2.sizeof是運算符
3.sizeof可以用類型做參數,還可以用函數做參數
4.數組做sizeof的參數不退化
5.sizeof在編譯期已經確定大小,這就是sizeof(x)可以用來定義數組維數的原因
6.sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因爲sizeof是個操作符不是個函數
7..當適用了於一個結構類型時或變量, sizeof 返回實際的大小, 當適用一靜態地空間數組, sizeof 歸還全部數組的尺 寸。 sizeof 操作符不能返回動態地被分派了的數組或外部的數組的尺寸
8..計算結構變量的大小就必須討論數據對齊問題。爲了CPU存取的速度最快(這同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C++在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。MS VC++中的對齊設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即可.或者如果要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁中的Data alignment爲按字節對齊。
9..sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。如sizeof(max)若此時變量max定義爲int max(),sizeof(char_v) 若此時char_v定義爲char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式  

【sizeof使用場合】
1.sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信
2.用它可以看看一類型的對象在內存中所佔的單元字節。
3.在動態分配一對象時,可以讓系統知道要分配多少內存。  
4.便於一些類型的擴充,在windows中就有很多結構內型就有一個專用的字段是用來放該類型的字節大小。  
5.由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量計算。  
6.如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。

發佈了16 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章