【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )
文章目录
- 一、报错记录
- 二、修改方案
一、报错记录
执行下面的代码 , 报错如下 :
执行的错误代码 :
#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 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )相关推荐
- 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类
目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...
- java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...
- Java中的栈内存和堆内存
共两篇文章 第一篇 1.Java中对象都是分配在heap(堆)中.从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间. (1)每个应用程序运行时,都有属于自己的一段内存空间,用 ...
- JS 中的 栈内存和堆内存
栈内存 1.访问顺序 栈是一种先进后出的数据结构,栈内存是内存中用于存放临时变量的一片内存块. 它是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶,另一端称为栈底. 2.存储数据 一 ...
- JS中的栈内存和堆内存
JS中的栈内存和堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象,池存放常量,所以也叫常量池. 栈数据结构 栈是一种特殊的列表,栈 ...
- c语言栈内存和堆内存大小,堆内存和栈内存及C++内存分配
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式 ...
- java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别
栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...
- C++中栈内存和堆内存区别
C++中栈内存和堆内存区别 栈内存:当对象** 所在的函数体**执行完毕时,栈内存里的数据就会被清理.如:Student std;(是栈内存) 堆内存:会一直存在,执行delete是会清楚.如果是指针 ...
- 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...
最新文章
- 2020年生肖码表图_2020年最好的计时码表,是这4款
- Java容器坐标起点_Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起点...
- java电脑类的接口_java 一个类实现两个接口的案例
- WordPress主题:自媒体二号大前端模板
- 长城汽车申请“哈弗单身狗”、“哈弗奶狗”、“哈弗溜狗”等商标
- python自助电影售票机_Spring Cloud版——电影售票系统六使用 Spring Cloud Config 统一管理微服务配置...
- 如何选择B2C电商仓储系统?
- memcache和redis本质区别在哪里?
- python列表去重_python 字典列表/列表套字典 去重重复的字典数据
- 点到圆弧的距离(csu1503)+几何
- EditPlus批量转码
- 网页抓取软件-免费网页自动采集抓取任意内容软件
- CAD打印 acad.ctb丢失
- Web页面弹出窗口代码大全
- git下载单个文件夹
- InfluxDB中Line Protocol理解
- 电脑文件服务器资源管理器在哪,资源管理器在哪?怎么打开资源管理器?5种方法总有适合你...
- java短信生成6位数的校验码
- matlab双边滤波处理点云,常见点云滤波算法
- One PUNCH Man——特征选择