[英]Why does C need a null zero as a string terminator while Java doesn't?
[英]Why does strlen() return strange result when array doesn't contain null terminator?
我有两个程序。 两者都从字符串文字初始化数组。 在一种情况下,数组大小正好是我想放入数组中的字符数。
我想知道为什么两个程序的strlen()
返回的大小输出不同。 是因为缺少终止空字符吗? 如果是这样,那么为什么输出是 16?
#include<stdio.h>
#include<string.h>
main()
{
char str[5] = "ankit";
printf("size of = %d \n ",sizeof(str));
int len = strlen(str);
printf("length = %d \n ",len);
}
输出:-大小= 5,长度= 16
#include<stdio.h>
#include<string.h>
main()
{
char str[] = "ankit";
printf("size of = %d \n ",sizeof(str));
int len = strlen(str);
printf("length = %d \n ",len);
}
输出:-大小= 6,长度= 5
您的char[5]
太短,无法容纳值"ankit"
。
正如您自己所说,C 样式字符串的末尾有\\0
终止符。 这意味着,您的字符串文字实际上在内部表示为"ankit\\0"
(其中 \\0 是单个字符)。
由于strlen()
函数找不到\\0
字符,因此它的行为未定义。
这意味着,您需要一个char[6]
来表示您的字符串。
通过省略数组的显式长度,您可以让编译器选择大小(通过初始化,在编译时已知)。 因此,编译器分配正确的大小(6 个字符)。
是的,这是因为第一个示例中的数组没有为 0 终止符留出足够的空间。 以下是strlen
基本工作原理:
size_t strlen( const char *str )
{
size_t len = 0;
while( *str++ )
len++;
return len;
}
strlen
从str
中第一个元素的地址开始,并“沿着”连续地址向下走,直到它看到一个0
字节。 由于strlen
不知道对应于str
的数组实际上有多大(它得到的只是一个指向第一个元素的指针),它会继续越过数组的末尾,直到看到0
。
所有字符串都是char
数组,但并非所有char
数组都是字符串; 如果没有零终止符,则它不是字符串。
char str[5]
最多可以包含 4 个字符,最后一个额外字节应保留给 '\\0' 字符。 因此它的未定义行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.