c/c++语言开发共享char *和char 与strcpy()之间的区别

过去几个小时我遇到了一个问题,虽然我明白了。 这是我的麻烦:

void cut_str(char* entry, int offset) { strcpy(entry, entry + offset); } char works[128] = "example1"; char* doesnt = "example2"; printf("output:n"); cut_str(works, 2); printf("%sn", works); cut_str(doesnt, 2); printf("%sn", doesnt); // output: // ample1 // Segmentation: fault 

我觉得char * / char []有一些重要的东西,我没有来到这里。

    不同之处在于,它doesnt指向属于字符串常量的内存,因此不可写。

    当你这样做

     char works[128] = "example1"; 

    编译器将不可写字符串的内容复制到可写数组中。 顺便说一下, 不是必需的。

    但是,当你这样做时,

     char* doesnt = "example2"; 

    编译器使指针指向不可写的内存区域。 同样, 将由编译器插入。

    如果你正在使用gcc ,你可以让它警告你用字符串文字初始化可写char * 。 选项是-Wwrite-strings 。 您将收到如下警告:

      warning: initialization discards qualifiers from pointer target type 

    声明你的指针的正确方法如下:

     const char* doesnt = "example2"; 

    char[]char *类型非常相似,所以你是对的。 不同之处在于初始化类型的对象时会发生什么。 您的对象works ,类型为char[] ,在堆栈上为其分配了128个字节的变量存储。 您的对象不是 char *类型, 在堆栈上没有存储空间。

    C标准没有指定存储的确切字符串,但很可能它存储在加载程序执行时加载的不可修改的数据段中。 这不是变量存储。 因此,当您尝试改变它时的段错误。

    这在堆栈上分配128个字节,并使用名称works来引用其地址:

     char works[128]; 

    所以works是指向可写内存的指针。

    这将创建一个字符串文字,它位于只读内存中,并使用名称doesnt来引用其地址:

     char * doesnt = "example2"; 

    您可以将数据写入works ,因为它指向可写内存。 您不能将数据写入doesnt ,因为它指向只读内存。

    另请注意,您不必使用""结束字符串文字,因为所有字符串文字都会隐式地在字符串末尾添加零字节。

      以上就是c/c++开发分享char *和char 与strcpy()之间的区别相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562736.html

      (0)
      上一篇 2021年2月5日
      下一篇 2021年2月5日

      精彩推荐