C++:关于内存分配

来源:百度知道 编辑:UC知道 时间:2024/06/04 05:49:58
void GetM(char *p,int num){
p=(char*)malloc(sizeof)(char)*num);
}
void Test(void){
char *str=NULL;
GetM(str,100);
strcpy(str,"hello");
}
不好意思,上面的有手误,这个才是原题:
void GetM(char *p,int num){
p=(char*)malloc(sizeof(char)*num);
}
void Test(void){
char *str=NULL;
GetM(str,100);
strcpy(str,"hello");
}
有什么错误,请详细解释??????

楼上的修改方法也没有解决任何问题.

这段程序运行后将会出现不可预料的错误(比如内存访问非法)导致程序崩溃.另外还有内存泄露:
1.void GetM(char *p,int num){ //这个定义也有大问题,请看2
p=(char*)malloc(sizeof(char)*num); //整个程序没有使用free释放空间,所以内存泄露.
}

2.char *str=NULL;
GetM(str,100); //调用函数后str仍然等于NULL,想知道为什么吗?请看3
strcpy(str,"hello"); //程序崩溃.

3.如果你将char*重新定义,你将很快发现错误.
typedef char* PCHAR;
你的函数变成了GetM(PCHAR p, int num);
如果你要改变str的值应该这样:
void GetM(char** pp, int num)
{
*pp=(char*)malloc(sizeof(char)*num);
}

char *str=NULL;
GetM(&str,100);
strcpy(str,"hello");
另外你应该写一个FreeM函数释放str的空间.这样也处理了内存泄露的问题

程序为了书写方便省略了错误处理

什么问题?
p=(char*)malloc(sizeof)(char)*num);
少了个括号
p=(char*)malloc((sizeof)(char)*num);
是不是笔误...?
----------------------------------------
有人回答了~ gis19831203说得很详细了~