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 %15s %12s %15s %18s\n", "序号", "姓名", "年龄", "电话", "地址");
printf("%5d %15s %12d %15d %18s\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 %15s %12s %15s %18s\n", "序号", "姓名", "年龄", "电话", "地址");
for (i = 0; i < k; i++)
{
printf("%5d %15s %12d %15d %18s\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;
}