思考一下,为什么在main函数中不能直接调用free(p)释放内存,而要调用free_unit(p)? 这个看的不是很懂,是不是避免内存泄露把?就是在mian()里面不知道alloc_unit()分配的空间类型unit_t中还有char *msg,如果不释放char *msg,就会造成内存泄露了。所有不能简单的用free(p),但是可以用free(p->msg),free(p);但是这样会早成程序的复杂性,而且容易忘记,所以最好是封装成函数free_unit()。
这就是正解:)
extern void get_a_day(char *const *); 表示是传入参数?
想一想,这里的参数指针是const char **,有const限定符,却不是传入参数而是传出参数,为什么?如果是传入参数应该怎么表示? 1.这里用char **作传出参数是因为是从redirect_ptr.c定义好的**msg里面取值。 2.如果要传入char **,应该保护两层吧? char const * const *pp这样对不?
是因为这样吗? 假如: 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类型的指针,不会发生错误。
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",这样实际是无法改变实参指针的值。
向大家学习,如果是一层指针传递地址是要在同一个栈空间,在不同的栈是要通过指针的指针、指针变量的地址来实现。
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将会出现在本书前言的致谢中。再次感谢您的宝贵意见!