首页 > 解决方案 > 将空字符串文字初始化或分配给 C 中指向 char 的指针或指向 C++ 中 const char 的指针的原因是什么?

问题描述

我的问题实际上对于那些可能知道它的人来说非常简单,但我问是因为我还不知道这种技术。

将空字符串文字初始化或分配给charC 中的指针或const charC++ 中的指针的原因是什么?

喜欢 fe:

char* p = "";

或者

char* p;
p = "";

或者,如评论中所建议的,在 C++ 中:

const char* p = "";

或者

const char* p;
p = "";

我确实经常看到这种技术,但不明白为什么有人要将空字符串文字分配给char指针(或const charC++ 的指针)或它的来源。


我已阅读Initialize a string in C to empty string,但这个问题的重点是char用空字符串初始化数组。

而且我还读过:Initializing a string with the empty string,但这个问题涵盖了将空字符串分配给函数早先返回的指针的错误方法malloc()

标签: c++cpointerscharstring-literals

解决方案


将空字符串文字初始化或分配给 C 中指向 char 的指针或指向 C++ 中 const char 的指针的原因是什么?

在我看来,这里似乎存在误解。指针使用空字符串初始化。它被初始化为指向一个空字符串(编译器放置在内存某处的字符串文字)。这是一个主要区别。

考虑这段代码:

char* p = "";
printf("%p\n", (void*)p);
p = "test";
printf("%p\n", (void*)p);

可能的输出:

0x563e72497007
0x563e72497008

在这些情况下p,编译器在其中放置了两个字符串文字(即“”在 0x563e72497007 和“test”在 0x563e72497008)的内存地址。所以在那个记忆中你有:

0x563e72497007 '\0'                  (i.e. the empty string that only consists 
                                           a string termination character`)

0x563e72497008 't' 'e' 's' 't' '\0'  (i.e. the string "test")

所以再次 -p没有用字符串初始化/分配,它被初始化/分配为指向 strings

为什么要初始化一个指向空字符串的指针?

好吧,它就像您初始化的任何其他变量一样......您这样做是因为您希望该变量具有已知值,以防在对其进行任何其他分配之前使用它。所以就像在做int i = 0;.

换句话说 - 你char* p = "";要确保它p指向一个有效的 C 风格的字符串。

一个非常简单的例子:

char* p = "";
if (answerIsWrong())
{
    p = "not";
}
printf("The answer is %s correct\n", p);

根据函数的返回值,answerIsWrong()这可能会打印:

The answer is correct

或者

The answer is not correct

在第一种情况下,重要的p是被初始化为指向一个空字符串。

但是,如果您知道在分配新值之前永远不会使用p它,那么显然没有理由初始化它!然而,一些程序员更喜欢总是初始化所有变量——即使他们在使用前分配了另一个值。

例子:

char* p = "";  // No reason for this initialization
               // p will be assigned another value before it's used

if (answerIsWrong())
{
    p = " not ";
}
else
{
    p = " absolutely ";
}
printf("The answer is %s correct\n", p);

推荐阅读