GetMemory(str);为什么不是传地址

forxn 2018-09-11 03:10:29
void GetMemory(char* p)
{
p = (char *)malloc(100);
}
int main(void)
{

char *str = NULL;
GetMemory(str);
strcpy(str, "hello");
printf(str);
}
...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zangfong 2018-09-11
  • 打赏
  • 举报
回复
引用 3 楼 XN6666 的回复:
我就是搞不清楚为什么非得这么写才行,感觉直接传str也可以啊

你的void GetMemory(char* p) 函数的参数p是一个字符指针变量,那你调用GetMemory(str);传入的参数是str,但到了调用函数GetMemory内部,实际上却是str的拷贝str',你在函数中做的任何操作,只影响了str',但是对str本身是没有任何影响的。
用下面简单的代码做个比较:
调用Get_Add不会改变变量a的值,一个道理,因为传入Get_Add函数的参数,只是a的一份拷贝a',变量a和a'的值相同,但是在内存中的物理地址不同。所以调用函数的结果只是改变a'的值,但是a是不会改变的,因为a'和a本来就是存在不同物理地址的两个变量。
调用Get_Add_2就不一样了,本身Get_Add_2的参数就是一个整型指针,这时你调用Get_Add_2(&a),虽然传入的也只是&a的拷贝&a',但是,&a和&a'的值都是变量a的物理地址,那么通过&a‘对这个物理地址进行的操作,就相当于通过&a在对变量a进行操作,当然也就改变了变量a的值
#include<stdio.h>

void Get_Add(int x)
{
x++;
printf("x = %d now\n",x);
}

void Get_Add_2(int *x)
{
(*x)++;
printf("*x = %d now\n",*x);
}


int main()
{
int a = 1;
Get_Add(a);
printf("after calling Get_Add, a = %d now\n",a);

//
Get_Add_2(&a);
printf("after calling Get_Add_2, a = %d now\n",a);

return 0;
}

starytx 2018-09-11
  • 打赏
  • 举报
回复
指针是一种地址变量,既然是变量,想要改变变量的值,就得先知道变量的地址。所以要改变指针的指向,只能把指针的地址传进去,否则改变的只是形参p的指向,而不是实参str
Isnis-fallen 2018-09-11
  • 打赏
  • 举报
回复
直接传str传入的是指针变量的值, 是一个副本, 不是原指针变量本身, 也不是原指针变量本身的地址
AlbertS 2018-09-11
  • 打赏
  • 举报
回复
调用GetMemory(str);时传入参数str,str是一个变量啊,传入后就变成了p,如果str一开始指向有效空间,现在改变p指向的内容是可以的,但是此时p指向的内存是无效的,然后又用了malloc,p指向了一个新的地方,但是这样无法改变str
想改变str,就必须传入str的地址,需要函数参数为char**才可以
forxn 2018-09-11
  • 打赏
  • 举报
回复
我就是搞不清楚为什么非得这么写才行,感觉直接传str也可以啊
forxn 2018-09-11
  • 打赏
  • 举报
回复
void GetMemory(char** p)
{
* p = (char *)malloc(100);
}
int main(void)
{

char *str = NULL;
GetMemory(&str);
strcpy(str, "hello");
printf(str);
}
自信男孩 2018-09-11
  • 打赏
  • 举报
回复
这个程序是有问题的。GetMemory传入str后不能获取到申请到的空间首地址,会导致内存泄露。

这个程序运行应该会遇到段错误。因为将"hello"拷贝加NULL开头的内存里。

你的问题没传地址,str也是地址呢

69,371

社区成员

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

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