>第 24 章 函数接口>两层指针的参数

吴书杰 wsj3000@gmail.com
2010-03-25 16:12:52

思考一下,为什么在main函数中不能直接调用free(p)释放内存,而要调用free_unit(p)?
这个看的不是很懂,是不是避免内存泄露把?就是在mian()里面不知道alloc_unit()分配的空间类型unit_t中还有char *msg,如果不释放char *msg,就会造成内存泄露了。所有不能简单的用free(p),但是可以用free(p->msg),free(p);但是这样会早成程序的复杂性,而且容易忘记,所以最好是封装成函数free_unit()。


宋劲杉 songjinshan@gmail.com
2010-03-26 17:05:04

这就是正解:)


daidai daidai0628@sina.com http://learn.akae.cn/media/ch24s03.html
2010-03-30 12:49:41

extern void get_a_day(char *const *);
表示是传入参数?


吴小咪 xunzhangthu@gmail.com
2011-07-02 01:43:30

想一想,这里的参数指针是const char **,有const限定符,却不是传入参数而是传出参数,为什么?如果是传入参数应该怎么表示?

1.这里用char **作传出参数是因为是从redirect_ptr.c定义好的**msg里面取值。
2.如果要传入char **,应该保护两层吧?
char const * const *pp这样对不?


William Ho hodezx@gmail.com
2011-08-21 21:07:37

是因为这样吗?

假如:
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;
}

在main函数中引用函数如alloc_unit(&pA),那么在函数alloc_unit中,指针pp得到main函数中指针pA的地址,alloc_unit函数的局部变量指针p指向malloc创造的空间。在最后的赋值*pp = p语句将出现错误。因为pp为指向unit_t类型的变量,所以语句左值为unit_t类型的变量,而右值为一个指向unit_t变量的指针。
如果接口为双层指针,则*pp是一个指向unit_t类型的指针,不会发生错误。


yy yyttbull@163.com
2011-09-08 13:44:09

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;
}
如果参数只用一层指针,那么函数最后的语句是"pp=p",这样实际是无法改变实参指针的值。


goldmelon 759719925@qq.com
2012-01-07 00:45:37

向大家学习,如果是一层指针传递地址是要在同一个栈空间,在不同的栈是要通过指针的指针、指针变量的地址来实现。


张岩 zhangyan1987124@163.com
2012-06-14 22:51:33

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;
}
一层指针的话,可以改变指针“所指向”内存的值,却无法改变“指针”本身,即pp所指向的地址。pp在返回后仍旧是原先的pp,仍然指向之前的地址。


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!