【问题标题】:Why is integer value of the (n+1)th term in a string is 0? [duplicate]为什么字符串中第 (n+1) 项的整数值为 0? [复制]
【发布时间】:2022-01-29 12:37:45
【问题描述】:

b[5] 的值(即最后一项之后的项)如何等于 0 ? 但是 b[6] 给出了一些随机数。

#include <stdio.h>
int main()
{
    char *b = "HELLO";
    printf("%d",b[5]);
    return 0;
}

【问题讨论】:

标签: arrays c string pointers casting


【解决方案1】:

C 字符串以 null 结尾。这就是为什么当你像整数一样打印它时,它会给出 0。

如果你这样做:

if(b[5] == '\0')
    printf("null detected\n");

然后将打印“检测到空值”。

原因是字符串作为指针传递,并且它们的大小是未知/传递的。因此,正如@Downloadpizza 所评论的那样,所有函数都使用空字符来检测结束。

你不应该访问超过空终止符的内存,因为这就像访问一个越界的数组。

【讨论】:

  • 我认为所有这些答案都缺乏这种方式的原因。原因是字符串作为指针传递,并且它们的大小未知/传递。所以所有函数都使用NUL来检测结束
  • 关于“您不能访问超过 NULL 终止符的内存”:字符串是任何以空字符结尾的字符序列。它可以是更大数组的一部分,在这种情况下,通过空终止符访问内存是可以的。有时解析字符串的程序可能会临时插入空字符以将子字符串传递给其他例程,但它仍然有一个包含多个字符串的数组,其中包含超过空终止符的附加数据。
  • 请注意,C 字符串以空字符结尾。 NULL 是另一回事;这是一个空指针常量的宏。
【解决方案2】:

C 语言使用“NULL TERMINATION”作为字符串的结尾。并且它的值对应于'0'。(NUL = 0的ASCII)(根据定义)。
注意:,您的字符串从

开始
 b[0]- H , b[1]- E , b[2]- L , b[3]- L , b[4]- O , b[5]- \0 [NULL Termination].


所以 b[5] 对应于第 6 个字节,因为它是字符串的结尾。它对应于 NUL(\0)

更多详情请参考链接:[C Strings]

【讨论】:

    【解决方案3】:

    C 使用空字符来标记字符串的结尾。空字符是值为零的字符。

    空字符会自动添加到字符串文字的末尾,因此"HELLO" 由字母 H、E、L、L、O 的字符和空字符组成。

    b[6] 将是超出字符串末尾的字符。由于这不是字符串的一部分,因此没有将内存设置为初始化字符串的一部分。它可能是您程序中的其他数据(包括您通常看不到的数据,因为它是支持 C 程序的幕后软件的一部分),并且访问它的行为不是由 C 标准定义的。访问它可能会以各种方式损坏您的程序。

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 2012-12-07
      • 2021-11-20
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多