C++中一个0xC0000005访问冲突问题
2024-08-29 00:36:21
在冯.诺依曼结构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");
最新文章
- linux下memcached安装以及启动
- win7+ubuntu双系统 重装win7后grub修复
- ubuntu 14.04 配置JavaWeb开发环境
- Operate blob data in Oracle via C#
- MySQL主从复制与读写分离 --非原创
- [小北De编程手记] : Selenium For C# 教程目录
- poj2253 最短路 floyd Frogger
- vi/vim 键盘
- Coreseek:indexer crashed神秘
- OSCache 使用
- WDA的配置
- 为了CET-4!
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
- Leetcode_12_Integer to Roman
- python之xml模块
- 结合API Gateway和Lambda实现登录时的重定向和表单提交请求(Python3实现)
- MapReduce过程详解及其性能优化
- Hibernate 的复杂用法HibernateCallback
- 表格插件datatables
- 0329--Scrum团队准备工作