字符异常的 C++ 指针
c++ pointer of char exception
当我这样做时:字符* 文本;文本 = "你好";它可以工作,但我在这里真正要做的是初始化字符指针,它不能保存值"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;
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错