9.1
头文件 stdlib.h
malloc() //开辟动态内存空间
calloc() //开辟动态内存空间,并初始化
realloc() //调整已开辟的动态内存空间大小
free() //释放
EX:
int *p=(int *)malloc(100); //开辟动态内存空间,大小为100字节,指针p指向这段空间的首地址
int *p=(int *)malloc(10*sizeof(int)); //开辟动态内存空间,大小为10*4=40字节
free(p); //释放p所指向的动态空间,此时的p必须指向全部空间的首地址,否则释放不完全
int *p=(int *)calloc(100); //开辟并初始化100字节的动态内存空间
int *ptr=p; //创建临时指针,记录下p所指向的地址
int *p=(int *)realloc(p,200); //把p所指向的动态内存空间调整为200字节,把新空间的首地址给p 这么做的好处是:如果新空间开辟失败,也不会丢失原空间的地址
if(p==NULL)
{ …………}; //检测是否开辟失败
p==NULL; //释放空间后,最好将指针p置空,避免越界访问
用malloc写一个通讯录,代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> //全局变量 记录通讯录中成员个数 int k = 0; //结构体 struct person { int num; char name[20]; int age; int pho; char add[30]; }; //菜单 int menu() { puts("****************************************"); puts("******** 我的通讯录 *** 请选择: *******"); puts("******** 1. 查找 **********************"); puts("******** 2. 添加 **********************"); puts("******** 3. 删除 **********************"); puts("******** 4. 查看 **********************"); puts("******** 5. 退出 **********************"); puts("****************************************"); int m = 0; scanf("%d", &m); return m; } //查找 void fin(struct person *p) { int i = 0; puts("请输入要查找的名字"); char a[20]; scanf("%s", &a); for (i = 0; i < k; i++) { if (strcmp(a,(*(p+i)).name )==0) { printf("%5s s s s s\n", "序号", "姓名", "年龄", "电话", "地址"); printf("] s d d s\n\n", (*(p + i)).num, (*(p + i)).name, (*(p + i)).age, (*(p + i)).pho, (*(p + i)).add); return; } } puts("查询失败"); return; } //添加 void add(struct person *p) { //检测通讯录是否已满 if (k = 100) { puts("无法添加,通讯录已满"); return; } (*(p + k)).num = (k+1); puts("请输入姓名"); scanf("%s", &(*(p + k)).name); puts("请输入年龄"); scanf("%d", &(*(p + k)).age); puts("请输入电话"); scanf("%d", &(*(p + k)).pho); puts("请输入地址"); scanf("%s", &(*(p + k)).add); k++; } //删除 void del(struct person *p) { puts("请输入要删除的联系人姓名:\n"); char a[20]; scanf("%s", &a); int i = 0; int j = 1; for (i = 0; i < k; i++) { if (strcmp(a, (*(p + i)).name) == 0) { for (j =1 ; j < k;j++) { (*(p + i + j - 1)).age = (*(p + i + j)).age; (*(p + i + j - 1)).pho = (*(p + i + j)).pho; strcpy((*(p + i + j - 1)).name, (*(p + i + j)).name); strcpy((*(p + i + j - 1)).add, (*(p + i + j)).add); } k--; puts("删除成功"); return; } puts("查无此人"); } return; } //查看 void che(struct person *p) { int i = 0; printf("%5s s s s s\n", "序号", "姓名", "年龄", "电话", "地址"); for (i = 0; i < k; i++) { printf("] s d d s\n\n", (*(p + i)).num, (*(p + i)).name, (*(p + i)).age, (*(p + i)).pho, (*(p + i)).add); } return; } int main() { system("color 0a"); //创建通讯录 struct person *p = (struct person*)malloc(100 * sizeof(struct person));//开辟MAX个(struct person)的内存空间 //检测是否开辟成功 if (p == NULL) { perror("开辟空间失败"); exit(EXIT_FAILURE); } //menu 菜单 menu:; int m = menu();//m接受指令 switch (m) { //fin查找 case(1):fin(p); break; //add添加 case(2):add(p); break; //del删除 case(3):del(p); break; //che查看 case(4):che(p); break; //end退出 case(5):goto end; //输入非法 default:puts("输入非法\n"); goto menu; } //返回菜单 goto menu; //结束 end:; //释放空间,置空指针 free(p); p = NULL; puts("再见"); system("pause"); return 0; }