我有一个数组
char * string = “hello”;
当我阅读string[5]
时,值为0。这不应该是一个随机值吗?
我的疑问来自于我memcmp
用来比较两个数组时。argv 长度比数组长度长,但可以正常工作。我知道memcmp
它在读取“\0”时停止,但数组没有“\0”。我在 Dev C++ 上对此进行了测试。
不,该数组"hello"
包含六个char
s,最后一个是'\0'
。所以在你的情况下string[5]
是可以保证的'\0'
。string[6]
然而,给你未定义的行为。
但memcmp
不会停在 0 字节处,只会停在 0 字节处strcmp
。
这"hello"
是一个字符串常量,保证以空值结尾。这意味着它在'\0'
您指定的最后一个字符之后包含一个附加字符。
换句话说,它实际上相当于:
char string[] = {'h', 'e', 'l', 'l', 'o', '\0'};
您可以使用以下方法轻松检查:
#include <stdio.h>
char string[] = "hello";
int main()
{
printf("%d\n", sizeof(string));
return 0;
}
(请注意,您不应该在生产代码中使用%d
with )sizeof()
该程序将输出6
.
是的 memcmp 可以比较一个没有 '\0' 的数组。
例如看看这段代码。
int main () {
char str1[]= "hello";
char str2[]= "hello";
std::cout << memcmp(str1, str2, 5);
std::cout << memcmp(str1, str2, 6);
return 0;
}
它们都在屏幕上打印 0。大小为 5 时,比较时不带 '\0'。当 size 为 6 时,还比较 '\0'。memcmp 只是比较内存块。