• C++ 无法从“const char [ ]”转换为“char *”


    C++ 无法从“const char [ ]”转换为“char *”

    高版本VS中(VS2017 ,VS2019)

    #include 
    int main()
    {
    	char* str ="1234";
    	
    	//printf("%s\n", str);
        std::cout << str << std::endl;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    此语句带来的问题,对于新标准来说,这是不允许的。
    在这里插入图片描述

    解决方法,按如下进行修改:

    1:在项目属性中 ,把符合模式更改为 ‘否’

    在这里插入图片描述

    2:使用强制类型转换:

    //char* p1 = "1234";
    char* p1 = (char *)"1234";
    
    • 1
    • 2

    3:使用数组首地址赋值指针

    char str[10] = "123";
    char* s1 = str;
    
    • 1
    • 2

    具体原原因 个人理解 C++ 语法检测很严格 ,赋值或初始化类型必须一致,看下面代码

    char ch1[] = "123";
    cout << typeid(ch1).name() << endl;
    char* pstr = nullptr;
    cout << typeid(pstr).name() << endl;
    auto s1 = "1234";
    cout << typeid(s1).name() << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:变量类型都不一致 ,所以要设定兼容性或者 强制转换。

    配置输出文件目录:

    在这里插入图片描述

    参考:https://blog.csdn.net/weixin_41049188/article/details/105323625

    补充:C语言 | char *str与char str[]的区别

    C语言中没有特定的字符串类型,常用以下两种方式定义字符串:一种是字符数组,另一种是指向字符串的指针。如下:

    1. char str[] = “happy”;

    2. char *str = “happy”;

    这种方式有什么不同呢?

    示例一:字符数组

    #include 
    
    int main(void)
    {
     char str[20] = "hello";
    
     str[0] = 'H';
     printf("%s\n",str);
    
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:

    Hello
    
    • 1

    示例二:指向字符串的指针

    #include 
    
    int main(void)
    {
     char *str = "hello";
    
     str[0] = 'H';
     printf("%s\n",str);
    
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:

    无打印信息输出
    
    • 1

    可见:

    • 使用示例一方式定义的字符串其字符是可以修改的,使用示例二方式定义的字符串其字符是不可以修改的。示例二中可以成功编译和链接,但运行时可能会出现错误,我编译坏境是64bit的,运行结果是无打印信息输出,在其他不同的平台运行可能会出现段错误(Segment Fault)或者写入位置错误。
    • 这两种表示字符串的方式的主要区别是:字符串指针指向的内容是不可修改的,字符数组是可以修改的,即示例二方式定义的字符串保存在常量区,是不可更改的,示例一方式定义的字符串保存在全局数据区或栈区,是可修改的。

    内存的分配方式:

    内存分配可分为三种:静态存储区、栈区、堆区。

    ​ 1、静态存储区:该内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,它主要存放静态数据、全局数据和常量。

    ​ 2、栈区:它的用途是完成函数的调用。在执行函数时,函数内局部变量及函数参数的存储单元在栈上创建,函数调用结束时这些存储单元自动被释放。

    ​ 3、堆区:程序在运行时使用库函数为变量申请内存,在变量使用结束后再调用库函数释放内存。动态内存的生存期是由我们决定的,如果我们不释放内存,就会导致内存泄漏。

  • 相关阅读:
    《痞子衡嵌入式半月刊》 第 72 期
    CentOS 系列版本搭建 Nginx 服务
    1836: 【USACO】Buying Feed(购买饲料)
    【GNN报告】蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
    .NET 中 GC 的模式与风格
    Docker创建Spring容器【方便服务迁移】
    【羊了个羊】背后的计算机网络原理
    Android Kotlin 协程详解
    Windows Server 2008 R2安装CVE-2023-35359相关补丁问题及自动进入修复模式无法启动的问题处理
    shiro授权-SSM
  • 原文地址:https://blog.csdn.net/weixin_40933653/article/details/126343486