常量字符* vs 常量字符[]
const char* vs const char[]
据我所知,像"Hello"这样的字符串文字
在 C 中被视为char*
,在 C++ 中被视为const char*
,对于这两种语言,字符串文本都存储在只读内存中。(如果我错了,请纠正我)
#include <stdio.h>
int main(void)
{
const char* c1;
const char* c2;
{
const char* source1 = "Hello";
c1 = source1;
const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
c2 = source2;
}
printf("c1 = %sn", c1); // prints Hello
printf("c2 = %sn", c2); // prints garbage
return 0;
}
为什么源 1 和源 2 的行为不同?(使用 gcc -std=c11 -W -O3 编译)
在此代码片段中
{
const char* source1 = "Hello";
c1 = source1;
const char source2[] = "Hi"; //isn't "Hi" in the same memory region as "Hello" ?
c2 = source2;
}
source2
是代码块的本地字符数组,在退出右大括号之后的块后将被销毁。
至于字符文字,它具有静态存储持续时间。因此,指向字符串文本的指针在退出代码块后将有效。字符串文本将与字符数组相反
。考虑到在 C 中字符串文字"Hello"
的类型是 char [6]
。也就是说,任何字符串文字的类型都是非常量字符数组。不过,您不能长弦文字。与 C 相反C++字符文本具有常量字符数组的类型。
const char* source1 = "Hello";
source1
只是内存位置上的指针,其中定义了Hello
。
const char source2[] = "Hi";
source2
是字符数组类型的局部变量,并具有另一个地址,即字符串文字Hi
。在第一次}
之后,source2将被销毁,c2
将被指向某个地方,但不在source2
的位置上,所以在source2
被销毁后取消引用c2
只是未定义的行为。
"嗨"与"你好"不是在同一个内存区域中吗?
你(巧妙地)错了。 "Hello"
本身是一个类型为(const
)char *
的表达式,但char source2[] = "Hi";
是一个定义、声明和初始化char [3]
对象的语句。看不到const char *
。在函数作用域中,该对象具有自动存储持续时间。
在您的用法中,source2
在以下}
中不复存在,并使c2
成为无效指针。以后c2
的使用是不确定的。
相关文章:
- 如何循环访问常量字符**?
- constexpr 函数获取常量字符*
- 如何计算常量字符**中的总字符数?
- QDial:如何将 int 值传递给需要常量字符*的 Qfile?
- 为什么 std::string_view 比常量字符*快?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 在编译时将常量字符* 转换为常量 char_type*
- 将字符串数组传递给接受常量字符**的函数
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 字符串强制转换为常量字符*
- 使用常量字符*时退出代码 139
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法<string>从"常量字符 []"转换为<类名>
- 初始化常量字符* 数组
- 常量字符*的性质是什么?
- C++ 获取向量中常量字符* [ ] 的长度
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- C++将常量字符* 指针数组传递给对象