读书人

内存储器相关

发布时间: 2013-10-28 11:21:45 作者: rapoo

内存相关
创建内存

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

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();

New和delete表达式

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;

读书人网 >编程

热点推荐