c++ - 将空字符串文字初始化或分配给 C 中指向 char 的指针或指向 C++ 中 const char 的指针的原因是什么?
问题描述
我的问题实际上对于那些可能知道它的人来说非常简单,但我问是因为我还不知道这种技术。
将空字符串文字初始化或分配给char
C 中的指针或const char
C++ 中的指针的原因是什么?
喜欢 fe:
char* p = "";
或者
char* p;
p = "";
或者,如评论中所建议的,在 C++ 中:
const char* p = "";
或者
const char* p;
p = "";
我确实经常看到这种技术,但不明白为什么有人要将空字符串文字分配给char
指针(或const char
C++ 的指针)或它的来源。
我已阅读Initialize a string in C to empty string,但这个问题的重点是char
用空字符串初始化数组。
而且我还读过:Initializing a string with the empty string,但这个问题涵盖了将空字符串分配给函数早先返回的指针的错误方法malloc()
。
解决方案
将空字符串文字初始化或分配给 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);
推荐阅读
- amazon-ec2 - Rails 6.0.2 App 需要什么配置才能部署在 AWS EC2 实例中?
- react-native - 使用 axios 上传文件时的问题
- javascript - MapBoxGL Draw:为什么我可以看到值时未定义事件的“FeatureTarget”?
- python - 在django rest框架中执行serializer.save()时如何更新模型对象,只有一个字段数据?
- mysql - 如何从 MySQL 数据库中获取用户数据并使用 Microsoft Bot Framework?
- java - Jenkins期间连接断开(主从结构)
- wordpress - 当执行以下钩子'wp_ajax_'时?
- python - 这是 Python 中的高效计算器吗?
- reactjs - 在 npm 包中使用 styled-component 时出现奇怪的问题
- javascript - Redux 程序 - 以下代码的输出未在 VS Code 终端中打印。没有错误但未打印输出