我有这样的代码,但我一直收到这个错误:
“const char *”类型的值不能用于初始化“char”类型的实体
*“。”发生了什么事?
我已阅读以下主题,但未能看到任何结果,因为所有结果都来自char
至char*
或char*
至{ {1}}:
Value type const char cannot be used to initialize an entity of type char*
Value of type char* cannot be used to initialize an entity of type "char"
char
编辑:我正在使用2017年的视觉工作室社区
答案 0 :(得分:7)
这是正确的。假设你有以下代码:
const char hello[] = "hello, world!";
char* jello = hello; // Not allowed, because:
jello[0] = 'J'; // Undefined behavior!
糟糕! const char*
是指向const char
的非const指针。如果将其值分配给非const char*
,则表示您已丢失其const
属性。
指向非const const
的{{1}} 指针将是char
,您可以整天初始化char* const
你想要的。
如果你真的想要的话,你可以用char*
实现这个目标,我偶尔会这样做,但这通常是一个严重的设计缺陷的迹象。如果您实际上让编译器发出指令以写入由字符串常量别名的内存,则会得到未定义的行为。 可能出错的许多事情之一是某些实现会将常量存储在只读内存中并崩溃。或者相同的内存字节可能会被重复用于多个目的,因为毕竟,我们警告过你永远不要改变它。
顺便说一句,C中的规则是不同的。这仅仅是为了与没有const_cast<char*>(p)
关键字的C的早期版本向后兼容,并且您永远不应该编写对字符串常量使用非const别名的新代码。
答案 1 :(得分:4)
您需要使字符串文字类型为 const
,因为在C ++中它是char
的常量数组,与C不同,它只是{{1}的数组}}。您无法更改字符串文字,因此在C ++中优先使其char
以获得额外的安全性。从const
到const char*
,您必须使用显式演员方式。它在技术上仍然在C ++中被“允许”,因为在C中允许它,这就是为什么它只是一个警告。这样做仍然是不好的做法。要修正警告,请将其设为char*
。
const
答案 2 :(得分:0)
尝试将值放在单引号中 char a ='b'; 不 char a =“ b”; 为我解决了问题:)