将C样式字符串初始化为NULL与空字符串之间的区别

dfg*_*dfg 5 c c++ string

这三个是等价的:

char* p= NULL;
char* q = "";
char r[] = {'\0'};
Run Code Online (Sandbox Code Playgroud)

我怀疑第一个与其他人不同,但我不完全确定.

Che*_*Alf 5

即使OP 将问题标记为C,我也在回答C++ .这是两种不同的语言.混淆它们并不是一个好主意.

本声明:

char* q = "";
Run Code Online (Sandbox Code Playgroud)

在C++ 03中使用了一个不推荐的转换,在C++ 11中变得无效.我们现在在C++ 14.


这两个声明:

char* p= NULL;
char r[] = {'\0'};
Run Code Online (Sandbox Code Playgroud)

根本不同.第一个声明一个指针并将其设置为null.第二个声明一个项目的数组,该项目设置为null.


关于

"这三个是等同的吗?

答案是否定的,根本不是:一个是无效的,一个是声明指针,一个是声明一个数组.


Cod*_*ice 3

char* p = NULL;
Run Code Online (Sandbox Code Playgroud)

这会将 NULL 分配给指针 p,这意味着它p不指向任何有效的内存地址。

char* q = "";
char r[] = {'\0'};
Run Code Online (Sandbox Code Playgroud)

它们都会创建空字符串并且基本上是等效的。与前面的示例q不同,它指向有效的内存地址。是一个带有空字符串的数组。pr

  • 第二行还暗示从“const char*”到“char*”的隐式转换,这在 C++ 中至少已被弃用。 (5认同)
  • 另外可能值得一提的是 `char* q = "";` 分配只读内存。`q[0] = Something` 将失败。 (2认同)