试图对初始化为字符串字面值的char指针的未定义行为进行推理
Trying to reason with an undefined behavior of char pointer initialized to string literals
假设我有这样一个程序:
#include <iostream>
using namespace std;
int main(){
char *c = new char;
cin>>c;
c = "Hello";
cin>>c;
delete c;
}
现在,我明白那些'se字符指针是一个常量指针值不能改变(或其他未定义行为),然而,在接下来的计划我真的不明白发生了什么,从我做所有我能看到的是我想创建常量字符串在内存和地址的指针(因此cin>>c;
c = "Hello";
)与字符指针允许(我不是试图改变指针指向的值),然而,也许上面的程序中有一些糖代码,或者我只是解释错了,这就是为什么我需要帮助,为什么上面的程序会给我一个关于未定义行为的错误提示?此外,由于我在c
中输入了超过1个文字,我应该做:delete[] c
吗?(因为字面量的集合基本上是一个数组,尽管c
没有被声明为char指针的数组,而是一个指向char的指针)
char *c = new char;
c
现在指向一个有一个字符空间的内存地址。
cin>>c;
这可能会导致未定义的行为。从这个答案:
这个操作符[>>]期望p指向一些内存(自动的、全局的、动态的——不管怎样)——它不会自己分配内存。它只是从输入流中读取字符,直到空格,并将其复制到p所指向的内存中,但p必须已经指向某些内存。
如果输入中有多个字符,则将写入未分配的内存。
c = "Hello";
这将指针重新赋值给静态const string对象"Hello"
的地址——具体来说,是该const string对象的第一个字符的地址。您用new
分配的内存地址现在丢失了。
cin>>c;
这是未定义的行为,因为它试图覆盖const char *
的字符-写入const
s是未定义的行为。
delete c;
这是一个未定义的行为,因为它试图删除一个没有由操作符new
返回的指针("Hello"
字面量的地址)。
(感谢Peter充实了最后两段内容)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- MSVC:推理指向具有常量和非常量重载的成员函数的指针
- 从函数指针对标准 C++98 中的函数类型参数进行静态推理
- 可能的编译器错误?使用从模板化静态成员函数检索的指针调用模板化方法时,无法进行自动推理
- 试图对初始化为字符串字面值的char指针的未定义行为进行推理