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

来源:互联网 发布:实矩阵有实SVD分解 编辑:程序博客网 时间:2024/06/05 20:32

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

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

开始时我只这样写的:

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


  

阅读全文
0 0
原创粉丝点击