簡體   English   中英

“NUL”字符(“\0”)字節是分隔的還是分配給帶有字符串的字符數組?

[英]Is the “NUL” character (“\0”) byte separated or is it assigned to that char-array with the string?

如果我定義一個字符串:

   char array[5] = {"hello"};

是否將 NUL 字符 (\0) 字節“隱藏”添加到“array[5]”中,使得 memory 中的數組不包含 5 個字節,而是包含 6 個字節?

或者 NUL 字符字節是否與 memory 中的“array[5]”“分開”僅在 char 數組的最后一個元素之后,但不直接分配給“array[5]”?

如果我會這樣說:

  i = strlen(array);
  printf("The Amount of bytes preserved for array: %d",i);

為數組 [5] 保留的字節數會是什么結果?

“NUL”字符(“\0”)字節是否位於 memory 中 char 數組的最后一個元素之后分隔,還是分配給該 char 數組?

“NUL”字符(“\0”)字節是否位於 memory 中 char 數組的最后一個元素之后分隔,還是分配給該 char 數組?

不,兩個答案都不正確。 詳情見下文。


C 的答案:

如果您這樣編寫代碼,並且顯式大小對於終止符來說太小,則array將恰好有 5 個元素,並且不會有 NUL 字符。

strlen(array)具有未定義的行為,因為array不是字符串(它沒有終止符)。 char array[5] = {"hello"}; 相當於char array[5] = {'h', 'e', 'l', 'l', 'o'}; .

另一方面,如果你寫

char array[] = "hello";

它相當於

char array[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

strlen將報告5

C標准的相關部分是:

字符類型的數組可以由字符串字面量初始化,可選地用大括號括起來。 字符串文字的連續字符(包括終止 null 字符,如果有空間或如果數組大小未知)初始化數組的元素。

(強調我的。)


C++ 的答案:

您的代碼無效。 [dcl.init.string]狀態:

初始化器的個數不得多於數組元素的個數。 [示例:

 char cv[4] = "asdf"; // error

格式不正確,因為隱含的尾隨'\0'沒有空間。 結束示例]

在 C++ 中, char array[5] = {"hello"}為 6 個字節。 但是您只分配了五個字節。 因此,數組聲明不正確。

或者,這可行: char array[6] = {"hello"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM