求问:动态内存申请问题

qq_20587645 2018-09-08 06:01:53
求问:这个程序申请动态内存不成功具体的解释!
void getmemory(char *p)
{
p=(char *)malloc(100);
strcpy(p,"hello world");
}

int main()
{
char *str;
getmemory(str);
printf("%s\n",str);
free(str);

return 0;
}
...全文
405 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdgdf566 2018-09-12
  • 打赏
  • 举报
回复
使用二级指针就行了
棉猴 2018-09-12
  • 打赏
  • 举报
回复
正如楼上几位所说,在getmemory()函数中,首先创建一个临时变量保存了指针str的内容,之后对临时变量本身的内容进行修改,将其赋值为新分配的内存地址,此时str的内容并没有发生变化。
例如,
void func(char* a)

{

a = new char();

*a = 'a';

return;

}


char* b = new char();

*b = 'b';

func(b);

此时形参与实参的关系为

解决方法就是楼上朋友说的,一种是将函数参数设置为指针的指针;另一种方法是使用函数的返回值。
关于函数参数设置为指针的指针,请参考《C++中函数参数类型为指针的指针》
希望能够帮到你
AlbertS 2018-09-11
  • 打赏
  • 举报
回复
申请时成功的,但是赋值时候没有传递回来,1楼说的很详细,值的学习
冷风1023 2018-09-11
  • 打赏
  • 举报
回复
了解下值传递和指针传递的含义,你这实际还是值传递
自信男孩 2018-09-11
  • 打赏
  • 举报
回复
申请是没问题的,问题是不能将申请的内存首地址带到main函数里,main函数里的str指向的还是原来的地址,即是一个野指针。

建议将main函数里的str指向NULL,这样运行就会必现段错误,让问题更清晰些。
林de 2018-09-10
  • 打赏
  • 举报
回复
猜测楼主可能误解了指针的意义,getmemory(str)实际上是把str本身的值(空,即nil)传给了p,这个并不是指针的间接引用。之后malloc会给p重新分配一个地址值,和原来的str没有半毛钱关系的。
zangfong 2018-09-08
  • 打赏
  • 举报
回复
你的实参是str,形参是p,在调用getmemory(str);时,实际上是给形参p申请了空间,然后给形参赋值了hello world,然后函数调用结束,形参p就嗝屁了,而此时实参str还并未初始化,连NULL都不是。
要解决这个问题,一种是传址,函数在调用时传入的是实参str的地址:
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

void getmemory(char **p)
{
*p=(char *)malloc(100);
strcpy(*p,"hello world");
}

int main()
{
char *str;
getmemory(&str);
printf("%s\n",str);
free(str);

return 0;
}

另一种方式是return,申请完空间后返回给实参str:
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

char * getmemory()
{
char *p=(char *)malloc(100);
strcpy(p,"hello world");
return p;
}

int main()
{
char *str = getmemory();
printf("%s\n",str);
free(str);

return 0;
}

69,372

社区成员

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

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