关于指针的问题,高手一看就明白的

xiejingking 2006-01-20 01:25:50
问题一,有下面两个程序;
1 void GetMemory(char *p)
{
p=(char*)malloc(100);
}

void main(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}

2 void GetMemory(char **p, int num)
{
*p=(char*)malloc(num);
}

void main(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello world");
printf(str);
}

第一个没有结果,第二个输出正确结果,请详细解释一个二者的不同,谢谢。

问题二,程序如下

char *GetMemory(void)
{
char p[]="hello world";
return p;
}

void main(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
为深该程序只能输出hell@这个东西,本人认为应该能输出整个hello world,请解释一下。
拜托各位了,高手一眼就能看出来,就帮小弟解决大问题了。
...全文
399 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiejingking 2006-01-22
  • 打赏
  • 举报
回复
谢谢诸位了,终于明白了,彻底明白了。
Darkay_Lee 2006-01-21
  • 打赏
  • 举报
回复
建议搂主,把“char *”看作是一个类型的整体就跟int一样,重新看看你自己的程序,再看看C中关于函数参数传递的规则就应该明白了。
// "char *" -> int
void GetMemory(int p)
{
p=(100);
}

void main(void)
{
int str=0;
GetMemory(str); 此处传给GetMemory的值为NULL
printf("%d", str);
}

2 void GetMemory(int *p, int num)
{
*p=(num);
}

void main(void)
{
int str=0;
GetMemory(&str,100);
printf("%d", str);
}
VxD1 2006-01-21
  • 打赏
  • 举报
回复
问题一,有下面两个程序;
1 void GetMemory(char *p)
{
p=(char*)malloc(100);
}

void main(void)
{
char *str=NULL;
GetMemory(str); 此处传给GetMemory的值为NULL
strcpy(str,"hello world");
printf(str);
}

2 void GetMemory(char **p, int num)
{
*p=(char*)malloc(num);
}

void main(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello world");
printf(str);
}

第一个没有结果,第二个输出正确结果,请详细解释一个二者的不同,谢谢。
atgjplh 2006-01-20
  • 打赏
  • 举报
回复
林锐《高质量C、C++编程指南》 这本书不错的
shu_yoyo 2006-01-20
  • 打赏
  • 举报
回复
林锐《高质量C、C++编程指南》看书去。
rubbish_only 2006-01-20
  • 打赏
  • 举报
回复
林锐《高质量C、C++编程指南》上面的题,建议lz去看看。
rubbish_only 2006-01-20
  • 打赏
  • 举报
回复
第一题:
GetMemory(char *p),函数的参数为指针,GetMemory(str);而主调函数的参数也是指针,p在GetMemory(char *p)内生成,因而属于GetMemory(char *p)的局部变量,储存在栈内,当程序结束后就销毁。当调用GetMemory(char *p)函数时,str传递给p,因为两个的类型一样,所以是传值,str传递给p,但str本身没有改变。而函数中*p=(char*)malloc(num);函数在堆中申请了一块内存,当函数完时,这块内存要等到整个程序完才被销毁。由于p被销毁,也不能被访问,这样是错误的。
第二题:
GetMemory(char **p, int num)参数p是指向指针的指针,也就是说p的值为指针的地址。
GetMemory(&str,100);当函数被调用时,str把自己的地址传给p,注意:是地址。第一题是把自己传给参数。因此,函数就在str指向的内容上操作,当函数结束,p被销毁,但结果是在str所指向的内容上操作,而str的内容属于main 函数,因此不受影响,故,操作的结果被保留。
第三题:
和第一题差不多,char p[]="hello world";p以及"hello world";(p指向的内容)都是char *GetMemory(void)函数的局部变量,在栈中,当程序结束,全都被销毁。因此,虽然把p传回去,但由于内容被销毁,在原来的地址处输出的内容是不可预料的。
逸学堂 2006-01-20
  • 打赏
  • 举报
回复
高质量C++/C 编程指南
http://www.exuesoft.com/News/View.aspx?NewsID=18

上面对这些问题有很好的解释!
三文鱼也会飞 2006-01-20
  • 打赏
  • 举报
回复
这是一个传值和传址的问题
jsjjms 2006-01-20
  • 打赏
  • 举报
回复
问题二,程序如下

char *GetMemory(void)
{
char p[]="hello world";
return p;
}

void main(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
+++++++++++++++++++++++++++++++++
经常看到这样的题目的,
char p[]="hello world";
为局部的,函数结束了空间被销毁了.
whatsouta 2006-01-20
  • 打赏
  • 举报
回复
GetMemory(str);
执行这句后,str仍然 == NULL

这和普通变量值传参是一样道理的
指针也是个变量
屋顶上的老猫 2006-01-20
  • 打赏
  • 举报
回复
林锐《高质量C、C++编程指南》上的原题,上面说的很清楚,建议自己看书!
Atomictry 2006-01-20
  • 打赏
  • 举报
回复
char *GetMemory(void)
{
char p[]="hello world";
return p;
}

p是栈内存的指针,函数返回的时候,内容会被清除,运气好的时候可能会对的。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧