首页 > 解决方案 > 结构中的字符串文字显示错误,但是当字符串文字声明为常量时,它不会显示错误,为什么?

问题描述

该程序已编译并运行但显示错误:ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]

#include<iostream>
using namespace std;
struct person{
 char* name;
 char* lastName;
 int age;
};
void show(person temp){
 cout << temp.name << " " << temp.lastName << " age is: " << temp.age;
}
int main(){
// decaring a person    
 person p;
 p.name = "Jayant";
 p.lastName = "Sharma";
 p.age = 18;
//reassigning of p 'name'
 p.name = "Kartik";
 show(p);
 return 0;
}
// output => Kartik age is: 18

但是当我使用 const 编译器声明变量时不会显示错误并且重新分配也完成了

struct person{
    const char* name;
    const char* lastName;
    int age;
};

将名称 'Kartik' 重新分配给相同的 const 变量 'name' 不会出错。

标签: c++data-structures

解决方案


我看到您对示例源代码的困惑。但是,我看到您没有明确说明但暗示的两个问题。所以我两个都回答!

什么是 C++ 中的字符串文字?

ISO/IEC C++ 标准将字符串文字定义为 const char * 数组,并且您的示例代码通过将变量namelastName声明为仅具有类型 char * 违反了此定义!尽管在 C 语言中不是这种情况,请参阅为什么从字符串常量转换为 'char*' 在 C 中有效但在 C++ 中无效以获取更多详细信息!

即使声明为常量,变量的赋值方式是什么?

编译器不会向您抛出错误,因为您没有正确使用 const 关键字!

const char* name = "Sharma";

上面的代码示例表明变量name中保存的是常量,但它的地址不是!

const char* const name = "Sharma"; 

现在上面的代码示例表明变量名中保存的地址都是常量!

当您使用对象运算符的成员时,您声明正在操作的内存地址是正在访问的对象的地址加上存储数据的偏移量。因此,您是通过地址间接修改变量!


推荐阅读