注册 登录
编程论坛 C++教室

开辟内存空间的疑问

H 发布于 2009-12-29 16:41, 1141 次点击
程序1:#include <iostream.h>
#include <string.h>
class CSample
{
    char *p1, *p2;
  public:     
    void init(char *s1, char *s2);
    void print()
    {
     cout<<"p1 ="<<p1<<'\n'<<"p2 = "<<p2<<'\n';
     }
    void copy(CSample &one);
    void free();
 
};

void CSample::init(char *s1, char *s2)
{
   p1=new char[strlen(s1)+1];
   p2=new char[strlen(s2)+1];
   strcpy(p1,s1);
   strcpy(p2,s2);
}

void CSample::copy(CSample &one)
{
   if (this!=&one ) *this=one;   
}
void CSample::free()
{
   delete[] this->p1;
   delete[] this->p2;

}


void main()
{
   CSample a,b;
   a.init("My name is ","andrew");
   a.print();   
   b.copy(a);  
   b.print();
   a.free();
}






程序2:
#include <iostream.h>
#include <string.h>
class CStrOne   
{   protected:
    char *pstr;   
    public:     
    CStrOne( char str[ ])
    {   pstr=str;
    }        
    void show()
    { cout<<"strings="<<pstr<<endl;           
    }
};

class CStrTwo:public CStrOne   
{  
    char *newpstr;   
    public:     
      CStrTwo( char str1[ ],char str2[ ]):CStrOne(str1)
    {   newpstr=str2;
    }        
    void show()
    {   cout<<"strings1="<<pstr<<endl;
        cout<<"strings2="<<newpstr<<endl;           
    }

    void joint()
    { char temp[100];
      strcpy(temp, pstr);
      newpstr=strcat(temp,newpstr);
      cout<<newpstr<<endl;
     }


};


void main()
{   
   CStrTwo str("My Name is Lian",", 45 years old");
   str.show();
   str.joint();
 }

为什么程序1里来的p1和p2使用时要开内存空间,而程序2pstr赋值不用开内存空间?
5 回复
#2
秀痘魔导士2009-12-29 16:47
   p1=new char[strlen(s1)+1];
   p2=new char[strlen(s2)+1];

pstr=str;
指针赋值只是改变指针指向的地址,第一段代码才是开辟内存空间
#3
H2009-12-29 17:01
那为什么pstr不开辟内存空间呢?

我的意思是pstr是否一定要开辟内存空间才可以使用?
#4
秀痘魔导士2009-12-29 17:04
以下是引用H在2009-12-29 17:01:04的发言:

那为什么pstr不开辟内存空间呢?

我的意思是pstr是否一定要开辟内存空间才可以使用?
不大明白你的意思,指针指向地址空间不就可以使用了吗?
#5
zb07nju2009-12-30 17:02
指针的声明一般像char* pstr =NULL;这样是比较安全的,以后你可以自己给pstr赋值,引用是必须在声明的时候就赋值的,指针的作用就是指向一个“已分配”的空间地址。
#6
yangliangbin2009-12-31 09:35
程序1:
程序代码:
void CSample::init(char *s1, char *s2)
{
   p1=new char[strlen(s1)+1];
   p2=new char[strlen(s2)+1];
   strcpy(p1,s1);
   strcpy(p2,s2);
}
这里开辟空间是为了能够过街字符串赋值,而不只是赋头指针
CStrOne( char str[ ])
    {   pstr=str;
    }
这里str是数组头指针、赋值给指针 pstr。知道头指针就可以输整串字符了
不懂的话看下字符指针那一章吧
1