1

我有一个数组

char * string = “hello”;

当我阅读string[5]时,值为0。这不应该是一个随机值吗?

我的疑问来自于我memcmp用来比较两个数组时。argv 长度比数组长度长,但可以正常工作。我知道memcmp它在读取“\0”时停止,但数组没有“\0”。我在 Dev C++ 上对此进行了测试。

4

3 回答 3

5

不,该数组"hello"包含六个chars,最后一个是'\0'。所以在你的情况下string[5]是可以保证的'\0'string[6]然而,给你未定义的行为。

memcmp不会停在 0 字节处,只会停在 0 字节处strcmp

于 2012-07-18T09:30:38.573 回答
4

"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;
}

(请注意,您不应该在生产代码中使用%dwith )sizeof()

该程序将输出6.

于 2012-07-18T09:35:51.077 回答
0

是的 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 只是比较内存块。

于 2012-07-18T09:56:29.083 回答