开辟动态空间

xiaoxiao2021-02-28  59

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; }

转载请注明原文地址: https://www.6miu.com/read-82098.html

最新回复(0)