【问题标题】:NULL assignment to a string causing warning message [duplicate]对导致警告消息的字符串分配 NULL [重复]
【发布时间】:2017-09-27 04:51:26
【问题描述】:

我知道 C 中字符串的定义是字符串末尾必须有 NUL 字符。我也知道以下语句会创建字符串的 NUL 字符:

 str[4] = 0;
 str[4] = '\0';

但是,当你使用这个语句时

 str[4] = NULL;

我收到这条消息:

string1.c:15:12: warning: assignment makes integer from pointer 
without a cast [enabled by default]

我对NULL的理解是它是一个定义为((void *)0)的宏。现在为什么这个分配会导致这个警告信息?这个警告信息的真正含义是什么?有人可以翻译这条消息以便更容易理解吗?

【问题讨论】:

  • NUL 是一个字符,它在 C 中是一种整数类型。 NULL 是一个指针。这有帮助吗?
  • @zwol - 有没有办法对字符串使用 NULL 而不会收到此警告消息?
  • @Nguai al - 为什么要将 NULL 分配给字符? NULL 用于指针。如果你想要\0 字符,直接使用它而不是使用宏NULL。
  • @Nguaial 当然有。但是在这里,您尝试将NULL 分配给str[4],这是一个字符。你可以这样做:const char *j = "hello"; j = NULL;。这里j 是一个字符串,然后您将NULL 分配给。

标签: c


【解决方案1】:

NULL 和 NUL \0 是非常不同的东西。 NULL 是实现定义的宏,定义为0(char*)0(void*)0,如果您的实现使用(void*)0(char*)0,则将其分配给char隐式转换为整数(chars 只是 1 字节整数)。另一方面,NUL \0 字符是字节大小 0。

【讨论】:

  • 但是NULL是为特定实现定义的,它是一个带有null pointer常量的宏,不应该赋值给整数.不保证空指针值具有所有位为零的表示或转换值。 “NUL”otoh 不是标准的格式部分,它只是一个字符代码的 ASCII 名称,所有位为零。在 C 中,它不是“不可见的字符”(这取决于映射到该位置的字符集和字形。实际上,它使数组成为 C 中的字符串。C 没有字符串类型。
  • NUL 是一个字节大小为零。它占用一个字节大小为零。
  • @Nguaial:请提供对标准的参考,其中甚至提到了符号/宏/等NUL。而且它不是“注意”的意思,而是像“CR”、“LF”等这样的ASCII码。在C中,null character有一个非常特殊的含义,它绝对不是“nothing”!
  • @nguai - 我还是不明白你想表达什么。
  • @EvilTeach - 你不清楚哪一部分?
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2017-04-22
  • 2016-09-14
  • 2011-01-21
  • 2012-12-27
相关资源
最近更新 更多