试图对初始化为字符串字面值的char指针的未定义行为进行推理

Trying to reason with an undefined behavior of char pointer initialized to string literals

本文关键字:推理 指针 未定义 char 字面值 初始化 字符串      更新时间:2023-10-16

假设我有这样一个程序:

#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充实了最后两段内容)