【发布时间】: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
b[5] 的值(即最后一项之后的项)如何等于 0 ? 但是 b[6] 给出了一些随机数。
#include <stdio.h>
int main()
{
char *b = "HELLO";
printf("%d",b[5]);
return 0;
}
【问题讨论】:
标签: arrays c string pointers casting
C 字符串以 null 结尾。这就是为什么当你像整数一样打印它时,它会给出 0。
如果你这样做:
if(b[5] == '\0')
printf("null detected\n");
然后将打印“检测到空值”。
原因是字符串作为指针传递,并且它们的大小是未知/传递的。因此,正如@Downloadpizza 所评论的那样,所有函数都使用空字符来检测结束。
你不应该访问超过空终止符的内存,因为这就像访问一个越界的数组。
【讨论】:
NULL 是另一回事;这是一个空指针常量的宏。
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]
【讨论】:
C 使用空字符来标记字符串的结尾。空字符是值为零的字符。
空字符会自动添加到字符串文字的末尾,因此"HELLO" 由字母 H、E、L、L、O 的字符和空字符组成。
b[6] 将是超出字符串末尾的字符。由于这不是字符串的一部分,因此没有将内存设置为初始化字符串的一部分。它可能是您程序中的其他数据(包括您通常看不到的数据,因为它是支持 C 程序的幕后软件的一部分),并且访问它的行为不是由 C 标准定义的。访问它可能会以各种方式损坏您的程序。
【讨论】: