據我了解,以 C 結尾的陣列在記憶體中用 " \0" 字符標記。
但究竟是什么?如果我有一個字串“ABC”,它的字符陣列的記憶體區域會是這樣的:
0x41 0x42 0x43 0x00?
因為如果是這樣,這是否意味著 int[] 陣列不能包含 0,因為這將標志著它的過早結束?即,[1, 2, 0, 3, 4]存盤為 bytes 0x01 0x02 0x00 0x03 0x04,然后在遇到 0x00 時,程式會說“哦,看,這是一個 2 位元組長的陣列,我們在這里完成了”?
uj5u.com熱心網友回復:
據我了解,以 C 結尾的陣列在記憶體中用“\0”字符標記。
C 語言中的 No 陣列沒有任何結束標記。
只有 C字串是 char(或多wchar_t位元組字符集)陣列,并且字串的結尾由null character
從 C 標準:
一個所有位都設定為 0 的位元組,稱為空字符,應存在于基本執行字符集中;它用于終止一個字串。
因此null character將具有值0(或十六進制的 0x00)。字符常量是'\0'(或L'\0'wchar_t 字串)
因為如果是這樣,那不就意味著 int[] 陣列不能包含
0
不,因為null character唯一終止C strings
為什么只需要那些?
因為包含字串的 char 陣列可能比字串本身大得多,您需要知道字串的結束位置。
但是當然,您的演算法可能會sentinel value為其他型別引入 a ,這將指示實際資料的結束位置。
uj5u.com熱心網友回復:
據我了解,以 C 結尾的陣列在記憶體中用“\0”字符標記。
你誤會了。
如果陣列的最后一個元素顯式或隱式設定為零,則陣列的末尾可以用零字符標記。
例如,如果您將宣告一個整數陣列,如
int a[] = { 1, 2, 3, 4, 5 };
那么陣列的任何元素都不存盤零。但是,如果您將陣列宣告為
int a[6] = { 1, 2, 3, 4, 5 };
那么實際上陣列的最后一個元素將被隱式初始化為零。
至于像這樣的字串文字,"ABC"它們存盤為帶有附加零字符的字符陣列。例如,字串文字"ABC"作為未命名陣列存盤在記憶體中,如
char unnamed_literal[] = { 'A', 'B', 'C', '\0' };
然后,您將使用字串文字初始化字符陣列,例如
char s[] = "ABC";
然后字串文字的所有字符(包括終止零)都用作已初始化陣列元素的初始值設定項。
那就是如果你在那之后寫
printf( "sizeof( s ) = %zu\n", sizeof( s ) );
然后這個陳述句輸出值4。
但是,在 C 中,當字符陣列由字串文字初始化時,您可以從初始值設定項中排除終止零。例如
char s[3] = "ABC";
在這種情況下,初始化的字符陣列將不包含字串(以零字符結尾的字符序列'\0'),該陣列s將僅包含三個字符 { 'A', 'B', 'C' }。你可以檢查這個如上圖所示
printf( "sizeof( s ) = %zu\n", sizeof( s ) );
在這種情況下,3將輸出該值。
至于你的說法
[1, 2, 0, 3, 4],存盤為位元組 0x01 0x02 0x00 0x03 0x04,然后在遇到 0x00 時,程式會說“哦,看,這是一個 2 位元組長的陣列,到此結束”?
然后注意在這種情況下兩個程式都沒有說什么。它是一個適當定義的函式,可以檢查陣列是否包含等于零的元素。
例如,C 標準中存在的此類函式依賴于字符陣列是否包含字串(以零字符 '\0' 結尾的字符序列)。例如,標準函式strlen回傳在遇到終止零之前存盤在字符陣列中的字符數。但是這個值并不表示陣列的結尾。字符陣列可以比其中存盤的字串的長度大得多。
對于整數陣列,C 標準中沒有這樣的函式。如果例如零表示陣列中實際元素的結尾,您可以自己為整數陣列撰寫這樣的函式。但通常零通常是一個有效的整數值,它可以與整數陣列元素中的其他值一起出現。
uj5u.com熱心網友回復:
它實際上是一個零(通常至少,我不確定標準是如何定義它的)。是型別(char,或者更確切地說是被視為字串的字符陣列)和使用的約定使其“特殊”,而不是零本身,即:標準庫函式依賴于以空字符結尾的字串。但是人們可以自由地撰寫他們自己的實作方式,這些實作方式會有所不同。現在,在實踐中這樣做可能不可行,但在技術上是可行的。
另請注意,也可以使用非終止字符陣列。根本就不是一個字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/367580.html
