求解下面一段c代码问题

shelless 2011-08-26 03:16:05
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}


在调用Test函数时出错,求解释。
...全文
198 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-08-26
  • 打赏
  • 举报
回复
没有不是人才的人,只有没放对岗位的人。
没有完全没用的代码,只有没放对地方的代码。
至善者善之敌 2011-08-26
  • 打赏
  • 举报
回复
需要加一句


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


但这么写往往不安全,如果中间有对地址做变动,比如str++了之类,还是会造成泄漏问题
至善者善之敌 2011-08-26
  • 打赏
  • 举报
回复

void GetMemory(char **p)
{
*p=(char *)malloc(100);
if ( *p == NULL )
printf("申请失败");
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
void main()
{
Test();
}



这样写存在内存泄露的情况
CJacky++ 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]
C/C++ code

void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
[/Quote]
手真快....
alickguo 2011-08-26
  • 打赏
  • 举报
回复
楼上瞎扯,关指针毛事,是形参与实参的问题.



void GetMemory(char **p)
{
*p = (char *)malloc(100);
}

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


/* 一般写成这种类型比较好 */
char *GetMemory ( size_t sz )
{
char *p
*p = (char *)malloc( sz );
return p;
}

void Test(void)
{
char *str = NULL;

str = GetMemory( 100 );
if ( str != NULL ){
strcpy(str, "hello world");
printf(str);
FreeMemory( str );
}
}

AndyZhang 2011-08-26
  • 打赏
  • 举报
回复
当形式参数是指针的时候,实参必须得是二级指针--传地址。
xunxun 2011-08-26
  • 打赏
  • 举报
回复
指针啊指针
xunxun 2011-08-26
  • 打赏
  • 举报
回复
LS你又来了
pengzhixi 2011-08-26
  • 打赏
  • 举报
回复
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}


赵4老师 2011-08-26
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

70,020

社区成员

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

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