在冯.诺依曼结构CPU(如i386,ARM A8,A9)的保护模式或者哈佛结构(如8051, ARM M0,.. M3)的CPU下,C++编译器将放置常量的内存设置为只读模式或者放入只读内存中,如果出现往常量内存中写入数据就会产生访问冲突异常。

如果在DOS的实模式的编译器,如Turbo C/Borland C++下,可能就不会报错。

举例,反转字符串:

#include "stdio.h"
#include "string.h" //反转字符串
char* ReverseStr(char* str, int len)
{
char* header= str;
char* tail= str + len -1;
char temp;//中间变量反转字符
while(header<tail)
{
temp = *header;
*header= *tail;
*tail= temp;
++header;
--tailer;
}
return str;
} int main()
{
char* s = "abcde";
printf("反转后为:%s\n",Reverse_Str(s, strlen(s)));
getchar();
return 0;
}

上面的程序看似没有错误,

运行时

在*header=*tail; 以及 *tail=temp 行会抛出异常://xxxx.exe 中的 0xxxxxxxxx 处未处理的异常: 0xC0000005: 写入位置 0xxxxxxxx 时发生访问冲突

问题出在变量声明: char *s="abcde";

这样定义字符串变量s,s指针是保存在堆上,但字符串“abcde”是一个常量,它是保存在常量区的,被写保护了,在反转函数中,*header= *tail,是更改常量内存的值,被写保护,所以会报内存写错误

如果把"abcde"定义到栈或者全局变量就不存在此问题了。

char s[20]; 
strcpy(s, "abcde");

最新文章

  1. linux下memcached安装以及启动
  2. win7+ubuntu双系统 重装win7后grub修复
  3. ubuntu 14.04 配置JavaWeb开发环境
  4. Operate blob data in Oracle via C#
  5. MySQL主从复制与读写分离 --非原创
  6. [小北De编程手记] : Selenium For C# 教程目录
  7. poj2253 最短路 floyd Frogger
  8. vi/vim 键盘
  9. Coreseek:indexer crashed神秘
  10. OSCache 使用
  11. WDA的配置
  12. 为了CET-4!
  13. HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
  14. Leetcode_12_Integer to Roman
  15. python之xml模块
  16. 结合API Gateway和Lambda实现登录时的重定向和表单提交请求(Python3实现)
  17. MapReduce过程详解及其性能优化
  18. Hibernate 的复杂用法HibernateCallback
  19. 表格插件datatables
  20. 0329--Scrum团队准备工作

热门文章

  1. 关于Ubuntu16.04下phpmyadmin出现mbstring错误的正解
  2. 打通版微社区(6):部署微信插件及开通QQ云服务
  3. 【运维】linux命令查看端口占用情况,杀死进程,后台启动进程
  4. switch结构可以更好的解决等值判断问题
  5. July 27th 2017 Week 30th Thursday
  6. Spring的IoC与AOP的理解
  7. 深入剖析php执行原理(4):函数的调用
  8. unittest:2 执行多条用例,仅执行一次setUp和tearDown
  9. 【转】多线程Core Data
  10. Linux系统之路——如何在服务器用U盘安装CentOS7.2(一)