【问题标题】:Is the "NUL" character ("\0") byte separated or is it assigned to that char-array with the string?“NUL”字符(“\0”)字节是分隔的还是用字符串分配给该字符数组?
【发布时间】:2023-04-04 04:29:01
【问题描述】:

如果我定义一个字符串:

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

是否将NUL字符(\0)字节“隐藏”添加到“array[5]”中,使得该数组在内存中不包含5个字节,而是包含6个字节?

或者,NUL 字符字节是否仅在 char 数组的最后一个元素之后与内存中的“array[5]”“分离”,但不直接分配给“array[5]”?

如果我会这样说:

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

为数组 [5] 保留的字节数会是什么结果?

“NUL”字符(“\0”)字节是在内存中 char-array 的最后一个元素之后分开还是分配给该 char-array?

【问题讨论】:

  • 空字符只是另一个字符。所以你的array[5] 太小了。
  • C 还是 C++?代码的效果在C和C++中完全不同。
  • @klutt 看到 melpomene 的回答。代码是有效的 C 但无效的 C++。

标签: c++ c string memory null


【解决方案1】:

在 C++ 中,char array[5] = {"hello"} 有六个字节。但是您只分配了五个字节。因此,数组声明不正确。

或者,这也有效:char array[6] = {"hello"}

【讨论】:

    【解决方案2】:

    “NUL”字符(“\0”)字节是在内存中 char-array 的最后一个元素之后分开还是分配给该 char-array?

    没有。两个答案都不正确。详情见下文。


    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标准的相关部分是:

    字符类型的数组可以由字符串字面量初始化,可选 括在大括号中。字符串文字的连续字符(包括 如果有空间或数组大小未知,则终止空字符)初始化 数组的元素。

    (强调我的。)


    C++ 答案:

    您的代码无效。 [dcl.init.string] 状态:

    初始化器的个数不得多于数组元素的个数。 [ 例子:

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

    格式不正确,因为隐含的尾随 '\0' 没有空间。 — 结束示例 ]

    【讨论】:

    • 而在第二个例子中,虽然strlen会报告5,sizeof会报告6。
    • @melpomene 非常感谢您的详细回答。所以我必须注意 NUL 字节才能将其视为数组元素?相反的意思是,当我像在char array[5] = "hello"; 之前写的那样使用它时,我不能将它用作字符串,对吧?
    • @RobertS 是的,这是正确的。您可以手动分配array[4] = '\0' 并将其用作四个字符的字符串,但char array[5] = "hello" 不是C 意义上的字符串。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多