字符异常的 C++ 指针

c++ pointer of char exception

本文关键字:指针 C++ 异常 字符      更新时间:2023-10-16

当我这样做时:字符* 文本;文本 = "你好";它可以工作,但我在这里真正要做的是初始化字符指针,它不能保存值"Hello",只是地址的值?如果我对 int 做同样的事情,它不起作用为什么?

文字

字符串最终成为指向程序数据部分的指针,因此它是安全的。但是当你为一个int*分配一个int时,它会告诉操作系统使用该不安全的内存位置

根据

C++标准§ 2.14.5/8

8 普通字符串文本

和 UTF-8 字符串文本也称为窄字符串文本。窄字符串文本的类型为"n const char 数组",其中 n 是下面定义的字符串大小,并具有静态存储持续时间

和第 2.14.5/14 节

14 在进行任何必要的连接后,在翻译阶段 7 (2.2) 中,"\0"将附加到每个字符串文本中,以便扫描字符串的程序可以找到其结尾。

"Hello"是窄字符串文字,它会产生

static const char __hello_str[] = { 'H', 'e', 'l', 'l', 'o', '' };

在C++中,继承自 C 的是数组指针等价的概念,在这种情况下,它归结为数组 - 或字符串文字 - 将很乐意衰减为指针。

char* text;
text = "hello";

在程序的 DATA 部分引入了一个以 NUL 结尾的静态字符数组,并将其地址分配给 char* 变量指针。

从技术上讲,我们在这里违反了数组的const性,但由于遗留的 C 代码,许多编译器允许这样做。但是,C++标准在附件C中规定:

子条款 2.14.5: 字符串文本的类型从"字符数组"更改为"常量字符数组"。的类型 char16_t字符串文本从"某个整数类型的数组"更改为"常量char16_t数组"。这 char32_t字符串文本的类型从"某个整数类型的数组"更改为"常量char32_t数组"。 宽字符串文本的类型从"wchar_t数组"更改为"常量wchar_t数组"。 理由:这样可以避免调用不适当的重载函数,该函数可能希望能够修改其参数。

旧版转换在一段时间前已弃用,自 C++11 年以来一直是非法的。正确的方法是:

const char* text;
text = "hello";  // correct

不清楚你是否在尝试写作

int* text;
text = "hello";  // error: incompatible types int* vs const char*

或者您是否正在尝试执行以下操作:

const int a = 1;
int* ptr;
ptr = &a;  // error: int* vs const int*.

重新举例

char* text; text = "Hello";    //! Not OK

字符串文字的类型为 char const [6] ,其中第 6 个char值是终止的零字节。

C++11 及更高版本开始,将其转换为 char* 无效。

但是,在 C++98 和 C++03 中,它对向后兼容 C 是有效的。字符串文字有一个特殊的规则,允许删除const。在 C++11 及更高版本中,您必须保持 const -ness(这更安全,因为修改文字是未定义的行为),即

char const* text; text = "Hello";

在这里,字符串文本衰减为指向第一个char值的char const*指针,并将此指针值分配给text

没有从int到指针值的这种隐式转换。但是如果你有一个int数组,该数组将隐式转换为指针。例如,

int const a[] = { 2, 7, 1, 8, 2, 8, 1, 8, 2, 8};
int const* p = a;