前景提要:前几天遇到了一个字符串逆序的面试,开始以为很简单,结果写的时候一直告诉我写入位置时发生冲突,
然后就一直想不通,我哪里错了,没错啊,最后看了下大神们的解释,原来是这样的。
开始时我只这样写的:
#include "stdafx.h"
#include "iostream"
using namespace std;
#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--;
}
{
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"
{
int c;
char *str = "asdfghjkl"; //错误在这里,改成 char str[]="asdfghjkl"
Reverse(str);
cout << str;
cin >> c;
return 0;
}
cout << str;
cin >> c;
return 0;
}
"asdfghjkl"只是一个常量,储存在常量区且不能被修改。而原来的str是一个指针,它指向一个常量,它只能改变它的指向,而不能改变它所指的常量。
改过之后,将常量复制到数组中,我们知道数组中的元素是可以改变的。运行下,正确的。
发生这种错误的原因是对程序的内存分配不够了解吗,程序的内存分配:
1,栈区(stack),由编译器自动生成释放,比如函数参数,局部变量等
2,堆区(heap),由程序员分配(new),为了完整和安全记得一定delete
3,全局区(静态区)(static),全局变量和静态变量(包括所有的静态全局变量,静态局部变量,静态数据成员)存放在全局区。初始化的全局变量和静态变量放在一起,未初始化的全局变量和未初始化的放在相邻的一块区域,程序结束后,由系统释放。