- 不废话就两个函数一个是错的,一个是修改过的都解释一下
-
- void GetMemory(char *p)
- {
- p = (char *)malloc(100);
- }
- void Test1(void)
- {
- char *str = NULL;
- GetMemory(str);
- strcpy(str, "hello world");
- printf(str); //str一直是空,程序崩溃
- }
- 形参不能改变实参所以p还是指向的空这是最扯淡的解释,往深里想为什么形参改变不了实参,这是因为她只是拷贝了实参的一个副本 。所以当你传指针的时候虽然改变了形参,但是你只是改变了形参所指向的东西,形参是没变化的,所以实参也是没变化的。打个比喻,就是一个盒子 他传给形参时,他会再创建一个盒子,但是这只是复制盒子的形状和外观,我改变的是盒子里面的东西,所以你们看到感觉这两个盒子里面的东西是一眼的其实不是。。。
- void GetMemory2(char **p, int num)
- {
- *p = (char *)malloc(num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(&str, 100);
- strcpy(str, "hello");
- printf(str);
- }
来理解一下二级指针
int **p;就表示一个指向指针的指针 如果对p第一次取值,那么取出来的值肯定是一个一级指针(也就是一级指针的地址)所以有*p=malloc(sizeof) 也就是说把申请这块内存的地址(值)给了一级指针(一级指针也相当于一个值是*p),这时候虽然没改变实参的值但是一级指针已经指向了malloc所申请的内存啦
再打个比喻就,就是实参和形参相当于2个相同的房子。每个房子里面都有个盒子,然后呢我*p=
(
char
*)malloc(num);这就表示 吧盒子换了一个新的。也就是一级指针的内容改变了。虽然我二级指针还是没改变但是我已经改变了一级指针(就是那个盒子)