在C++中,常量字符串存储在常量存储区,不允许被修改。
对于一个变量,要考虑到其定义、释放、存储区域、是否允许被修改。
在C++中,内存分为5个区,分别是:
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
(编译器分配和释放,允许被修改)
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
(new分配,delete释放,允许被修改)
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
(malloc分配,free释放,允许被修改)
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
(static定义,程序结束时自动释放,允许被修改)
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
(const定义,程序结束时自动释放,不允许被修改)
example:编写子函数实现对一个字符串进行翻转操作。
函数原型:char * sort(char * );
功能:实现对字符串的翻转;
要求:可以直接sort(“werhoglf”),对常量字符串进行排序。
难点1:常量字符串存储在常量存储区,不允许被修改。所以不能在其上直接进行排序修改;
难点2:基于以上的考虑,需要在函数内部定义一个指针变量,把常量字符串拷贝入该指针变量,再进行排序。保证函数退出时,该指针变量指向的内存不会被释放。因此考虑到全局指针变量、静态指针变量、堆指针变量(new定义、delete释放)、自由存储区指针变量(malloc定义、free释放)。
sln1:定义一个全局指针变量,函数返回全局变量指针。
include "stdafx.h"
#include "stdlib.h"
#include<iostream>
#include<malloc.h>
using namespace std;
char *des=(char*)malloc(10);
//sln1:define a globle array to avoid being cleared when the function is ended.
char * sort(char * );
int main()
{
char*p=sort("wdfdjgltrpy");
cout<<p;
return 0;
}
char * sort(char* sourse)
{
int i=0,j,n=0;
char t;
while(sourse[i]!='\0')
{
n++;
des[i]=sourse[i];
i++;
}
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(des[j+1]<des[j])
{
t=des[j];
des[j]=des[j+1];
des[j+1]=t;
}
}
des[n]='\0';
return des;
}
sln2:定义一个静态指针变量。
include "stdafx.h"
#include "stdlib.h"
#include<iostream>
#include<malloc.h>
using namespace std;
char * sort(char * );
int main()
{
char*p=sort("wdfdjgltrpy");
cout<<p;
return 0;
}
char * sort(char* sourse)
{
int i=0,j,n=0;
char t;
static char* des=new char[20];
//static pointer can only be allocated using "new" not "malloc"??
while(sourse[i]!='\0')
{
n++;
des[i]=sourse[i];
i++;
}
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(des[j+1]<des[j])
{
t=des[j];
des[j]=des[j+1];
des[j+1]=t;
}
}
des[n]='\0';
return des;
}
sln3:定义一个存储在自由存储区的指针变量。
include "stdafx.h"
#include "stdlib.h"
#include<iostream>
#include<malloc.h>
char * sort(char * );
int main()
{
char*p=sort("wdfdjgltrpy");
cout<<p;
return 0;
}
char * sort(char* sourse)
{
int i=0,j,n=0;
char* des=(char*)malloc(20*sizeof(char));
while(sourse[i]!='\0')
{
n++;
des[i]=sourse[i];
i++;
}
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(des[j+1]<des[j])
{
t=des[j];
des[j]=des[j+1];
des[j+1]=t;
}
}
des[n]='\0';
return des;
}
另外注意,
1.使用malloc是动态分配内存,若在函数体外未使用free释放,当函数被多次调用后,容易造成内存不足;
2.使用new是静态分配内存(??),当函数被多次调用时,函数结果被最后一次调用所得结果覆盖;