如何在c中用NULL(或0)初始化静态char数组

新手上路,请多包涵

我试图像这种语法一样用 NULL 初始化 char 数组。

 char str[5] = NULL;

但它返回错误..如何在 C++ 中用 NULL 或 0 初始化 char 数组?

具体来说,我想在这个示例代码中打印“Hello”。

 #include <iostream>
int main()
{
 char str[5] = NULL;
 if(!str)
  std::cout << "Hello" << std::endl;
 return 0;
}

由于初始化不正确,此代码将返回错误。那么,我应该用什么初始化句子替换句子?

原文由 favdew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 773
2 个回答

数组不能为空。 Null 是指针的状态,数组不是指针。

在表达式 !str 中,数组将衰减到第一个元素的地址。这个衰减地址的类型是指针,但不能修改衰减指针。由于数组永远不会存储在地址 0 中(除非在嵌入式系统上的某些特殊情况下,数组实际上可能存储在该内存位置), !str 永远不会为真。

您可以做的是将数组的所有子对象初始化为零。这可以使用值初始化语法来实现:

 char str[5]{};

正如我之前解释的那样, !str 仍然没有意义,并且总是错误的。您可能会做的一件明智的事情是检查数组是否包含空字符串。一个空字符串除了终止符之外什么都不包含(数组可以在终止符之后有元素,但这些不是字符串的一部分)。

检查字符串是否为空的最简单方法是检查第一个字符是否为终止符(值初始化的字符将是终止符,因此值初始化的字符数组确实包含空字符串):

 if (!str[0]) // true if the string is empty

原文由 eerorika 发布,翻译遵循 CC BY-SA 4.0 许可协议

//...
char str[5] = {'\0'};
if (str[0] != '\0')
//...

如果您现在将一些字符放入 str 中,它将打印 str 直到最后一个 ‘\0’。每个字符串文字都以’\0’结尾,你必须确保你的数组也以’\0’结尾,否则,数据将被读取到你的数组之外(直到遇到’\0’)并且可能超出你的应用程序的内存空间在这种情况下,您的应用程序将崩溃。

但是,如果您需要字符串,则应该使用 std::string 或 QString 。

原文由 Frederik De Ruyck 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题