天天看点

有关C++中常量字符串的一个小问题

在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是静态分配内存(??),当函数被多次调用时,函数结果被最后一次调用所得结果覆盖;

继续阅读