字符串逆序问题(解决方案)——及写入位置时发生访问冲突

    前景提要:前几天遇到了一个字符串逆序的面试,开始以为很简单,结果写的时候一直告诉我写入位置时发生冲突,

然后就一直想不通,我哪里错了,没错啊,最后看了下大神们的解释,原来是这样的。

开始时我只这样写的:

#include "stdafx.h"
#include "iostream"
using namespace std;
void Reverse(char* s)
{
     char *begin = s;
     char *end = s;
     for (int i = 1; i < strlen(s); i++)
          end++;
    while (begin < end)
   {
         char t = *begin;
         *begin = *end;
         *end = t;
          begin++;
          end--;
 }
}
int main()
{
    int c;
    char *str = "asdfghjkl";    //错误在这里,改成 char str[]="asdfghjkl"
    Reverse(str);
    cout << str;
    cin >> c;
     return 0;
}

"asdfghjkl"只是一个常量,储存在常量区且不能被修改。而原来的str是一个指针,它指向一个常量,它只能改变它的指向,而不能改变它所指的常量。

改过之后,将常量复制到数组中,我们知道数组中的元素是可以改变的。运行下,正确的。


发生这种错误的原因是对程序的内存分配不够了解吗,程序的内存分配:

1,栈区(stack),由编译器自动生成释放,比如函数参数,局部变量等

2,堆区(heap),由程序员分配(new),为了完整和安全记得一定delete

3,全局区(静态区)(static),全局变量和静态变量(包括所有的静态全局变量,静态局部变量,静态数据成员)存放在全局区。初始化的全局变量和静态变量放在一起,未初始化的全局变量和未初始化的放在相邻的一块区域,程序结束后,由系统释放。


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值