假設我有我寫的代碼如下: -在分配值時char *是否終止String使用null?
char *abc = " Who cares";
int len= strlen(abc);
這爲我提供了ABC的長度。我的疑問是,Strlen如何確定這裏abc的長度爲 。當然,它會查找空終止並返回值。但那是否意味着abc在我初始化值爲「誰在乎」的地方被賦值爲空?
假設我有我寫的代碼如下: -在分配值時char *是否終止String使用null?
char *abc = " Who cares";
int len= strlen(abc);
這爲我提供了ABC的長度。我的疑問是,Strlen如何確定這裏abc的長度爲 。當然,它會查找空終止並返回值。但那是否意味着abc在我初始化值爲「誰在乎」的地方被賦值爲空?
是的,strlen
遍歷abc
指向的內存,直到找到空終止字符。
abc
未用null初始化。編譯器將字符串放置在內存中的某處(包括隱式空終止字符);然後用字符串中第一個字符的地址初始化abc
。
所以:
0x1234 0x123E (example addresses)
+--+--+--+--+--+--+--+--+--+--+--+
| |W |h |o | |c |a |r |e |s |\0|
+--+--+--+--+--+--+--+--+--+--+--+
^
|
|
abc = 0x1234
char *abc = " Who cares";
聲明指針abd
到位於只讀(執行定義)的位置有一根弦文字"Who Cares"
。是的,它是NULL終止的。
不要試圖修改此字符串,因爲它會導致未定義行爲。
而且,在C++中聲明此正確的做法是:
const char *abc = " Who cares";
1。 'null'這個詞可能有點混亂。它有兩種不同的使用方式。說「abc沒有用null初始化」可能有點不必要。重要的是編譯器總是在字符串文本中加入終止'\ 0'。 – 2011-12-21 20:23:53
@Aaron:OP詢問「abc分配爲空」,所以我只是迴應那個直接問題... – 2011-12-21 20:25:20
非常感謝Oli ...是否意味着我們傳遞並存儲在內存某處的任何字符串都有最後附加了一個隱含的空字符。如果是這樣的話,爲什麼我們會在一些罕見的情況下得到附加的垃圾價值,這些情況下無法識別空終止。 – Invictus 2011-12-21 20:26:13