【问题标题】:Why NULL is not the same as '\0' [duplicate]为什么NULL与'\ 0'不同[重复]
【发布时间】:2015-01-10 05:42:40
【问题描述】:

我有以下代码:

char alfabeto[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
                   'n','o','p','q','r','s','t','u','v','w','x','y','z'};  

int i = 0;

printf("|");

do
{
    printf("%c |",alfabeto[i]);
    i++;
}while(alfabeto[i]!= '\0');

使用 NULL 我收到以下警告:

warning: comparison between pointer and integer [enabled by default] in C

但是使用'\0' 可以编译。我知道哪个 '\0' 用于终止字符字符串,而 NULL 用于与指针进行比较。但是它们的价值不一样吗?

【问题讨论】:

  • 请注意,您的 alfabeto 字符数组不是以 null 结尾的(这意味着它不是字符串),因此无法保证循环何时终止,或者之后会打印什么垃圾z.

标签: c pointers char


【解决方案1】:

在大多数实现中,NULL 和'\0' 具有相同的值:两者都是零。区别在于数据类型:NULL 是指针,而另一个是int。将指针与不是指针的任何东西进行比较是没有意义的,这就是编译器给你一个警告的原因。

【讨论】:

  • 严格来说,字面量'\0'的类型是int
  • 谢谢@YuHao!标准明确规定 整数字符常量的类型为 int
【解决方案2】:

它们的值相同,但类型不同。

  • \00 相同
  • NULL 是实现定义的,但通常与 (void*)0 相同。

您应该始终着眼于使用具有正确类型的表达式。

【讨论】:

    【解决方案3】:

    NULL 的类型为 void*,但 '\0' 的类型为 int

    void* 是指针,所以在我的机器上是 8 个字节。 int 是 4 个字节。

    在 C++ 中,'\0' 是 1 个字节的 char

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 2014-01-05
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多