链表栈 创建一个指针,使它指向另一个指针,这是可能的,而且常常也是必要的。这一技术有时被称为句柄。在某些情况下,操作系统需要有自主移动堆上的内存块的能力,这时就要用到此技术。下面是一个指针的例子,它指向了另一个指针:
int **p; int *q; p = (int **)malloc(sizeof(int *)); *p = (int *)malloc(sizeof(int)); **p = 12; q = *p; printf("%dn", *q); free(q); free(p);
Windows和Mac OS使用这种结构支持堆上的内存压缩。应用程序使用指针p,而操作系统负责管理指针*p。因为控制了*p,所以操作系统可以移动*p指向的内存块(**p),并将*p指向新地址,而这一切不会影响使用p的应用程序。在C中,这种指向指针的指针,还常常用于处理函数的指针参数。
指向包含指针结构体的指针
typedef struct {char name[21];char city[21];char phone[21]; char *comment;} Addr; Addr *s; char comm[100]; s=(Addr *)malloc(sizeof(Addr)); gets(s->name, 20); gets(s->city, 20); gets( s->phone, 20); gets(comm, 100); s->comment= (char *)malloc(sizeof(char[strlen(comm)+1])); strcpy(s->comment, comm);
指针s指向一个结构体,此结构体又包含一个指向字符串的指针:
本例中,如果不小心很容易将内存块丢失。例如下面的代码:
s=(Addr *)malloc(sizeof(Addr)); gets(comm, 100); s->comment= (char *)malloc(sizeof(char[strlen(comm)+1])); strcpy(s->comment, comm); free(s);
因为包含指向字符串指针的结构体先于字符串被释放,所以此程序产生了一个内存块泄漏,如下所示:
链接
typedef struct { char name[21]; char city[21]; char state[21]; Addr *next;} Addr; Addr *first;
这是可以通过编译的。利用上面的代码,再加上一点编程经验,您就可以创建如下的数据结构:
动手一试
C常见错误 |
|
来自: ldjsld > 《电脑手机及电子技术》