免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6292 | 回复: 12

[C] 为什么一层指针的函数接口void alloc_unit(unit_t *p);不能分配内存,而一定要用两层 [复制链接]

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-02-21 14:54 |显示全部楼层
例 24.4. 通过两层指针参数分配内存

/* para_allocator.h */
#ifndef PARA_ALLOCATOR_H
#define PARA_ALLOCATOR_H

typedef struct {
     int number;
     char *msg;
} unit_t;

extern void alloc_unit(unit_t **);
extern void free_unit(unit_t *);

#endif
/* para_allocator.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "para_allocator.h"

void alloc_unit(unit_t **pp)
{
     unit_t *p = malloc(sizeof(unit_t));
     if(p == NULL) {
          printf("out of memory\n");
          exit(1);
     }
     p->number = 3;
     p->msg = malloc(20);
     strcpy(p->msg, "Hello World!");
     *pp = p;
}

void free_unit(unit_t *p)
{
     free(p->msg);
     free(p);
}
/* main.c */
#include <stdio.h>
#include "para_allocator.h"

int main(void)
{
     unit_t *p = NULL;

     alloc_unit(&p);
     printf("number: %d\nmsg: %s\n", p->number, p->msg);
     free_unit(p);
     p = NULL;
     return 0;
}

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
发表于 2014-02-21 15:32 |显示全部楼层
要修改一个值,必须传递它的指针,C++中还可以是引用。同样,要修改指针的值,也必须传递它的指针(或者引用)。

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
发表于 2014-02-21 16:13 |显示全部楼层
弄懂C只有值传递 就明白了
弄懂C++ 只有值传递和引用传递 就明白了

弄不明所谓的 指针传递只是值传递 就明白了

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-02-21 17:51 |显示全部楼层
还是不明白啊 即使是按值传递  那也是实参指向哪里  让形参也指向哪里  两个指向的还是同一个地方回复 3# lin5161678


   

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-02-21 17:53 |显示全部楼层
本帖最后由 lifayi2008 于 2014-02-22 10:52 编辑

明白你的意思  就是在函数中修改一个全局变量的值必须把它的地址作为参数传到函数中,那同样在函数中要修改一个指针指向的地址也同样需要把这个指针的地址传到函数中,就是针对这个题还是有些糊里糊涂的回复 2# zhaohongjian000


   

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
发表于 2014-02-21 20:56 |显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. typedef struct
  5. {
  6.      int number;
  7.      char *msg;
  8. } unit_t;

  9. void
  10. alloc_unit(unit_t *pp)
  11. {
  12.      unit_t *p = malloc(sizeof(unit_t));
  13.      if(p == NULL) {
  14.           printf("out of memory\n");
  15.           exit(1);
  16.      }
  17.      p->number = 3;
  18.      p->msg = malloc(20);
  19.      strcpy(p->msg, "Hello World!");
  20.      pp = p;
  21. }

  22. void
  23. free_unit(unit_t *p)
  24. {
  25.      free(p->msg);
  26.      free(p);
  27. }


  28. main ()
  29. {
  30.      unit_t *t = NULL;

  31.      alloc_unit(t);
  32.      printf("number: %d\nmsg: %s\n", t->number, t->msg);
  33.      free_unit(t);
  34.      t = NULL;
  35.      return 0;
  36. }
复制代码
这是我按照你的思路写的一层指针,只是简单修改了下,
首先要分清形参和实参的值传递,我们一步步分析;
1、首先从main函数执行,执行unit_t *t = NULL语句,此时t的值是t=(unit_t*)0x0;
2、然后调用alloc_unit()函数,实参t把它的值,也就是地址(unit_t*)0x0赋值给形参pp;
3、然后执行以下代码:
  1.      unit_t *p = malloc(sizeof(unit_t));
  2.      if(p == NULL) {
  3.           printf("out of memory\n");
  4.           exit(1);
  5.      }
  6.      p->number = 3;
  7.      p->msg = malloc(20);
  8.      strcpy(p->msg, "Hello World!");
复制代码
假设自动变量p的值,也就是地址为(unit_t*)0x601010;
4、然后执行 pp = p;语句,即把地址(unit_t*)0x601010赋值给形参变量pp,此时是赋值给形参pp!!!!!!!!!!!!!;执行完这条语句后,函数alloc_unit()也执行完了,形参pp和变量p都是自动变量,他们的生存期也就到了,系统为他们分配的内存空间也就释放了,
5、现在该明白了吧,你根本就没有把函数alloc_unit()内的p变量的值(指针)传递给main函数内的t变量,此时它的值仍然是(unit_t*)0x0。


解释完了!

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
发表于 2014-02-21 21:00 |显示全部楼层
2、然后调用alloc_unit()函数,实参t把它的值,也就是地址(unit_t*)0x0赋值给形参pp;

修改一下,应该是:2、然后调用alloc_unit()函数,实参t把它的值,也就是地址(unit_t*)0x0传递给形参pp;

论坛徽章:
2
技术图书徽章
日期:2014-02-24 10:31:04技术图书徽章
日期:2014-03-20 16:11:43
发表于 2014-02-21 21:01 |显示全部楼层
今天只看了一个帖子

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
发表于 2014-02-22 00:32 |显示全部楼层
怎么不行?
1、T *alloc();
2、struct A{ T * a; }; void alloc(A *);
都是一层指针

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2014-02-22 11:06 |显示全部楼层
谢谢你的解释  基本明白了    之前混淆了以指针作为参数传入函数中后   究竟是  形参名 = 实参名    还是  *形参名 = *实参名   来初始化形参的   现在看应该是前者 只能用地址来初始化指针回复 7# 4059056


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP