C/C++ 字符串反转,处未处理的异常: 0xC0000005:写入位置 0x0041563c 时发生访问冲突

来源:百度知道 编辑:UC知道 时间:2024/05/20 20:28:35
#include "stdio.h"
#include "string.h"

char* reverse_str(char* str)
{
int len = strlen(str);
char* front_ptr = str;//指向str第一个指针
char* rear_ptr = str + len -1;//指向最后一个字符
char temp;//中间变量反转字符
while(front_ptr<rear_ptr)
{
//前后字符反转
temp = *front_ptr;
*front_ptr = *rear_ptr;//ConsoleTest.exe 中的 0x004113f8 处未处理的异常: 0xC0000005: 写入位置 0x0041563c 时发生访问冲突
*rear_ptr = temp; //ConsoleTest.exe 中的 0x00411400 处未处理的异常: 0xC0000005: 写入位置 0x0041563e 时发生访问冲突
//指针向中间移动
++front_ptr;
--rear_ptr;
}
return str;//返回地址吗?
}

int main()
{
char* abc = "abc";
printf("反转后为:%s\n",reverse_str(abc));
getchar();
return 0;
}

编译没问题,(vs03、05,DevCpp都可以编译)但是运行时候有错,会自动中断。
提示为:0x004113f8 指令引用0x0041563c 内存。该内存不能为written。while循环中的前后字符交换为什么不能执行?
不知道是这个程序的问题还是我的电脑硬件和系统的问题?
有哪位高手知道怎么办?

程序本身没有问题,但你犯了一个常见的内存与指针错误,char* abc = "abc"; 你这样定义字符串变量abc,abc是保存在堆上,但字符串“abc”是一个常量,它是保存在常量区的,你在反转函数中,front_ptr = *rear_ptr,是更改常量的值,所以会报内存写错误,你可以把abc定义成在一个栈上的变量,这样就不会有问题

char abc[20];
strcpy(abc, "abc");

像"abc"这样的字符串是常量,你不能随意修改。一楼说得很详细了。

现有三种解决办法:

1. 重新定义函数
把函数定义成 int reverse_str(const char* _Src, char* _Buf, size_t buf_len);

2. 用new分配一块内存,以存放输出内容
...
char* pOutput = new char[len];
...
return pOutput;
但执行完函数后还需调用delete以释放内存。

3. 用C++ STL里面的函数
std::string::reserve()

因为你的abc 指向的是字符串常量,所以不能修改指针指向的内容
你应该把char* abc = "abc";
改为 char abc[4] = "abc" ;

程序没问题 建议你去看林锐博士写的高质量C++编程
里面涉及到很多我们容易出错的问题 就比如你这个
你应该把char* abc = "abc";
改为 char abc[4] = "abc" ;