- 论坛徽章:
- 2
|
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- typedef struct
- {
- int number;
- char *msg;
- } 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;
- }
- void
- free_unit(unit_t *p)
- {
- free(p->msg);
- free(p);
- }
- main ()
- {
- unit_t *t = NULL;
- alloc_unit(t);
- printf("number: %d\nmsg: %s\n", t->number, t->msg);
- free_unit(t);
- t = NULL;
- return 0;
- }
复制代码 这是我按照你的思路写的一层指针,只是简单修改了下,
首先要分清形参和实参的值传递,我们一步步分析;
1、首先从main函数执行,执行unit_t *t = NULL语句,此时t的值是t=(unit_t*)0x0;
2、然后调用alloc_unit()函数,实参t把它的值,也就是地址(unit_t*)0x0赋值给形参pp;
3、然后执行以下代码:- 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!");
复制代码 假设自动变量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。
解释完了! |
|