内存相关

创建内存

注意一点:指针在未初始化之前是不能使用

void *getMemory(char *p,int num)

{

       p=(char *)malloc(sizeof(char)*num);

       //return p;

}

void main()

{

       char *str=NULL;

       getMemory(str,100);

       strcpy(str,"hello");

       cout<<str<<endl;

       getchar();

}

上述初始化程序是不会成功的,因为p复制了str,创建了内存指向p,但是str仍未空。

解决方案1

char *getMemory(char *p,int num)

{

       p=(char *)malloc(sizeof(char)*num);

       return p;

}

void main()

{

       char *str=NULL;

       str=getMemory(str,100);

       strcpy(str,"hello");

       cout<<str<<endl;

       getchar();

}

返回指针的方式解决

解决方案2

void getMemory(char **p,int num)

{

       *p=(char *)malloc(sizeof(char)*num);

}

void main()

{

       char *str=NULL;

       getMemory(&str,100);

       strcpy(str,"hello");

       cout<<str<<endl;

       getchar();

}

用指向指针的指针来解决问题

传递动态内存 

对于返回值是引用或指针,千万不能返回局部对象的相关属性

char *strA()

{

       char str[]="hello";

       return str;

}

void main()

{

       char *temp=NULL;

       temp=strA();

       cout<<temp<<endl;

       getchar();

}

上述代码会报错,因为str会被释放掉

修改方案1,如下:

char *strA()

{

       static char *str="hello";

       return str;

}

void main()

{

       char *str="hlo";

       str=strA();

       cout<<str<<endl;

       getchar();

}

返回值是在静态变量区

修改方案2如下:

char *strA()

{

       char *str="hello";

       return str;

}

void main()

{

       char *temp=NULL;

       temp=strA();

       cout<<temp<<endl;

       getchar();

}

运行正确,其中char *str="hello",“hello”保存在只读数据段,而不是保存在全局变量区或静态变量区,下面代码可以证明:

char *str="hello";

       *str="hi"; //报错,error C2440: =: 无法从“const char [3]”转换为“char

       cout<<str<<endl;

       getchar();

Newdelete表达式

int *pi=new int()

cout<<*pi<<endl; //the result is 0;

int i;

void main()

{

       cout<<i<<endl;

       getchar();

} // the result is 0

因为i是一个全局变量,全局变量会初始化为零

void main()

{

       int i;

       cout<<i<<endl;

       getchar();

}

不会做任何默认的初始化,输出失败

int *pi=new int;

cout<<*pi<<endl;

此时无法初始化,输出失败

delete之后,重设指针的值

Delete p;

P=0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值