C++问题,跪求下面4个指针是为什么错,求详解。

#include<stdio.h>#include<stdlib.h>#include<string.h>voidGetMemory(char*p){p=(char*)m... #include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void *GetMemory(void)
{
char p[]="hello world";
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void Test(void)
{
char *str=(char*)malloc(100);
strcpy(str,"hello world");
free(str);
if(str=NULL)
{
strcpy(str,"hello world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p,int num)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
展开
 我来答
xoaxa
2014-12-16 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3447万
展开全部
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *GetMemory(int n) { //  参数及返回类型都变了
return (char *)malloc(n);
}

void Test(void) {
char *str = GetMemory(100); // 这样获得动态内存
strcpy(str,"hello world\n");
printf(str);
free(str); // 返还是必要的。
}

int main() {
Test();
return 0;
}

/*
void *GetMemory(void) { // 这样是不行的,函数返回后,p[]就不存在了
char p[]="hello world";
}

void Test(void) { // 这样是可以的。
char *str = (char*)malloc(100);
strcpy(str,"hello world");
if(str != NULL) {
strcpy(str,"hello world");
printf(str);
free(str);
}
}

*/
heptnaol
推荐于2017-10-10 · TA获得超过7260个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1787万
展开全部
第一种,p=(char*)malloc(100);简单的给形参p赋值为新分配的内存地址,不过我们知道,改变形参的值,并不能改变实参的值,所以char *str=NULL;在GetMemory运行之后,仍然是NULL指针。
第二种,char p[]="hello world";,这是堆栈上的临时变量,只在函数调用到GetMemory的时候有效,GetMemory返回到Test中的时候,已经无效了

第三种,无论如何,free之后的指针不应该继续使用,它不会立即出错,但是会在将来的某个时刻,毁掉你的程序。
第四中,通过传递地址调用,可以为str实际赋值为有效内存地址,通常都是这么做的。
追问
第二个GetMemory()时不是已经将字符串赋值给*str了吗?
追答
赋值是赋值了,只不过这个值是临时有效的,因为是堆栈上的内存。
赋值的时候,GetMemory函数已经结束了吧,结束了就无效了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式