内存储器相关
创建内存
注意一点:指针在未初始化之前是不能使用
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;