sizeof()以及strlen的一些考量

2022-04-21 20:47:41 字數 1361 閱讀 8525

(很長一段時間沒有更新部落格了)

sizeof(object) 大家都知道 得到object的長度以位元組為單位。

那麼我們這樣做幾個實驗:

char info="hello";

char *p=info;

sizeof(info);

sizeof(p);

這些簡單的當然很多人都知道,第乙個返回的是6 第二個返回的是char* 型別在機器上的位元組數(在我的64windows版本上這個值是4);

然後有意思的事情就發生了:

char info="hello" 這句話,十分的熟悉吧。其等價於 char info[5]="hello" 嗎?

是不是有點疑惑,其實在編譯階段 char info[5]="hello" 就無法通過。是不是有點詭異,為什麼呢 按照我們自己的設想

error 1 error c2117: 'info' : array bounds overflow e:\vs2010project\01\01\01.cpp 16

這裡涉及到乙個問題,windows下(linux本人不熟,不敢妄言)字串的是以『\0『結尾的,那麼在編譯在靜態棧上生氣申請區域的時候,windows是強制

給字串型別加上『\0『,這樣以來在申請字串儲存空間的時候,往往要多申請乙個。所以我們經常會看到一下的**:

#define max 65536

char buffer[max+1];

是小小的問題,但是卻值得注意,往往越界就經常這樣在不明白的時候發生。

同時 我們也會想到這樣乙個問題 既然char info[5]=「hello「編譯不過,那我們換成 char info[6]="hello"吧。這樣總是可以的吧。但是我們有沒想過

在我們經常教導著不能訪問的char[5]上到底存在著什麼? 試試就知道了:

for(int i=0;i<6;i++)

{ printf(「%c 「,info[i]);}

結果如下:

h e l l o 

在o後面其實輸出了乙個空字元 '\0'

不相信,那我們這樣試下 info[5]='c,這句本身在教科書上是說不讓訪問的,這裡我們強制j將'\0'給拿掉

然後在這樣

pritf("%s",info)

結果:hello****  *代表了一對不可**的字元。說明了info[5]='\0' 是對的。。。

這裡可以做乙個標記,在我們申請靜態字串的空間時候,系統會自動在後面新增'\0';

而對於使用malloc 和new 等動態申請的字串,系統是不會在你的字串最後新增'\0',這個時候就只能自己

主動去填加咯。 

strlen和sizeof的區別以及計算盲區

1.sizeof是算符,strlen是函式 2.sizeof其值在編譯時即計算好了,strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,sizeof則是型別佔記憶體的大小 strlen是庫函式,在標頭檔案string.h裡面。引數必須是字元型指標 char 當陣列名作為引數傳入時,實...

sizeof求位元組以及與strlen的區別

例子一 根據以下條件進行計算 1 結構體的大小等於結構體內最大成員大小的整數倍 2 結構體內的成員的首位址相對於結構體首位址的偏移量是其型別大小的整數倍,比如說double型成員相對於結構體的首位址的位址 偏移量應該是8的倍數。include include using namespace std ...

sizeof 與 strlen 的區別

一 示例 eg1 下列 char buffer 256 char pbuffer buffer cout sizeof buffer cout sizeof pbuffer 其執行結果為 eg2 簡單說明 sizeof gives the amount of storage,in bytes,ass...