文章目录

  • 一、报错记录
  • 二、修改方案

一、报错记录


执行下面的代码 , 报错如下 :

执行的错误代码 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{// 将下面的字符串翻转char *str = "sdfsdfsdabc4548411abc";// 计算字符串长度int len = strlen(str);// 指向字符串开始位置的指针char *p_start = str;char *p_end = str + len - 1;// 从两边向中间遍历// 利用指向收尾的指针 , 交互指针指向的元素while (p_start < p_end) {// 交换收尾字符// 记录 p_start 指针指向的首部字符char c = *p_start;// 将尾部字符赋值给首部字符*p_start = *p_end;// 将首部字符赋值给尾部字符*p_end = c;// 指向头部的指针自增p_start++;// 指向尾部的指针自减p_end--;}// 打印结果printf("str = %s\n", str);// 命令行不要退出system("pause");return 0;
}

二、修改方案


上述报错是因为

    // 将下面的字符串翻转char *str = "sdfsdfsdabc4548411abc";

字符串导致 , 该字符串存储在 全局区 的 常量区 ;

char *str 指针指向了 常量区 ;

之后 , 通过指针尝试修改该常量区的字符串 , 才有了上述报错 ;

        // 交换收尾字符// 记录 p_start 指针指向的首部字符char c = *p_start;// 将尾部字符赋值给首部字符*p_start = *p_end;// 将首部字符赋值给尾部字符*p_end = c;

修改方案 : 将字符串定义为如下样式 , 字符串在 栈区 和 常量区各有一份 , 可以任意修改栈区的字符串 , 常量区的字符串仅用于赋值操作 ;

    // 将下面的字符串翻转char str[] = "sdfsdfsdabc4548411abc";

完整代码 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{// 将下面的字符串翻转char str[] = "sdfsdfsdabc4548411abc";// 计算字符串长度int len = strlen(str);// 指向字符串开始位置的指针char *p_start = str;char *p_end = str + len - 1;// 从两边向中间遍历// 利用指向收尾的指针 , 交互指针指向的元素while (p_start < p_end) {// 交换收尾字符// 记录 p_start 指针指向的首部字符char c = *p_start;// 将尾部字符赋值给首部字符*p_start = *p_end;// 将首部字符赋值给尾部字符*p_end = c;// 指向头部的指针自增p_start++;// 指向尾部的指针自减p_end--;}// 打印结果printf("str = %s\n", str);// 命令行不要退出system("pause");return 0;
}

【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )相关推荐

  1. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

  2. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  3. Java中的栈内存和堆内存

    共两篇文章 第一篇 1.Java中对象都是分配在heap(堆)中.从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间. (1)每个应用程序运行时,都有属于自己的一段内存空间,用 ...

  4. JS 中的 栈内存和堆内存

    栈内存 1.访问顺序 栈是一种先进后出的数据结构,栈内存是内存中用于存放临时变量的一片内存块. 它是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶,另一端称为栈底. 2.存储数据 一 ...

  5. JS中的栈内存和堆内存

    JS中的栈内存和堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象,池存放常量,所以也叫常量池. 栈数据结构 栈是一种特殊的列表,栈 ...

  6. c语言栈内存和堆内存大小,堆内存和栈内存及C++内存分配

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式 ...

  7. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  8. C++中栈内存和堆内存区别

    C++中栈内存和堆内存区别 栈内存:当对象** 所在的函数体**执行完毕时,栈内存里的数据就会被清理.如:Student std;(是栈内存) 堆内存:会一直存在,执行delete是会清楚.如果是指针 ...

  9. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

最新文章

  1. 2020年生肖码表图_2020年最好的计时码表,是这4款
  2. Java容器坐标起点_Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起点...
  3. java电脑类的接口_java 一个类实现两个接口的案例
  4. WordPress主题:自媒体二号大前端模板
  5. 长城汽车申请“哈弗单身狗”、“哈弗奶狗”、“哈弗溜狗”等商标
  6. python自助电影售票机_Spring Cloud版——电影售票系统六使用 Spring Cloud Config 统一管理微服务配置...
  7. 如何选择B2C电商仓储系统?
  8. memcache和redis本质区别在哪里?
  9. python列表去重_python 字典列表/列表套字典 去重重复的字典数据
  10. 点到圆弧的距离(csu1503)+几何
  11. EditPlus批量转码
  12. 网页抓取软件-免费网页自动采集抓取任意内容软件
  13. CAD打印 acad.ctb丢失
  14. Web页面弹出窗口代码大全
  15. git下载单个文件夹
  16. InfluxDB中Line Protocol理解
  17. 电脑文件服务器资源管理器在哪,资源管理器在哪?怎么打开资源管理器?5种方法总有适合你...
  18. java短信生成6位数的校验码
  19. matlab双边滤波处理点云,常见点云滤波算法
  20. One PUNCH Man——特征选择

热门文章

  1. Dell服务器网络不通故障排除
  2. [自定义区间-Range]书里的例子 - 中文数字类
  3. andorid 通过包名启动应用
  4. Java 异常基础 Exception
  5. SVN在centos5.4的安装步骤:
  6. P4324 [JSOI2016]扭动的回文串
  7. 小x的质数(线性O(n)筛素数)
  8. map遍历react中img图片路径出错
  9. ajax-典型应用-验证用户名
  10. git diff的用法