1、申请空间 malloc
函数: void *malloc(size_t size);
头文件:#include <stdlib.h>
参数:申请的内存空间的大小(字节)
返回值:如果申请成功,则会返回申请到的空间的首地址,如果申请失败,则返回NULL
2、释放空间 free
函数: void free(void *ptr);
头文件:#include <stdlib.h>
参数:你要释放的空间的首地址,也就是mallo的返回值!
注意:malloc的返回值必须保存起来,因为free需要这个地址释放这篇空间!
返回值:无
3、memset/bzero
(1)memset
函数: void * memset(void *s, int c, size_t n);
头文件:#include <string.h>
函数功能:用一个常量来填充内存
参数1:填充的空间的首地址
参数2:填充的字符
参数3:填充的内存空间的大小
在本文中主要用来填充0:清空的作用
(2) bzero
函数: void bzero(void *s, size_t n);
头文件:#include <strings.h>
函数功能:清空前n个字节
参数1:清空的空间的首地址
参数2:清空的大小
4、案例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define S 3 //几门成绩
#define N 20
//学生结构体
typedef struct student
{
char name[N];
int age;
float score[S];
}Stu;
//函数功能:打印菜单
//参数:无 void
//返回值:无 void
void menu()
{
printf("1---------------输入:\n");
printf("2---------------输出:\n");
printf("3---------------年龄最大的人:\n");
printf("4---------------根据年龄排序:\n");
printf("5---------------根据姓名排序:\n");
printf("6---------------根据成绩的总和进行排序:\n");
printf("7---------------退出:\n");
}
//函数功能:申请空间
//参数1:学生个数 int
//返回值:malloc开辟的空间的首地址 Stu *
Stu * new_address(int count)
{
Stu * p = NULL;
p = (Stu *)malloc(sizeof(Stu)*count);
//判断是否申请成功
if(NULL == p)
{
printf("malloc error\n");
return 0;
}
printf("malloc success\n");
//清空
memset(p,0,sizeof(Stu));
return p;
}
//函数功能:输入
//参数1:开辟的空间的首地址:Stu *
//参数2:学生个数 int
//返回值:无 void
void scan(Stu * p,int count)
{
int i =0;
int j = 0;
for(i = 0;i<count;i++)
{
printf("请输入学生的姓名:\n");
scanf("%s",p->name);
printf("请输入%s学生的年龄:\n",p->name);
scanf("%d",&p->age);
printf("请输入%s学生的%d门成绩:\n",p->name,S);
for(j=0;j<S;j++)
{
scanf("%f",&p->score[j]);
}
p++;
}
}
//函数功能:输出
//参数1:开辟的空间的首地址:Stu *
//参数2:学生个数 int
//返回值:无 void
void print(Stu * p,int count)
{
int i = 0;
int j = 0;
for(i = 0;i<count;i++)
{
printf("学生姓名:%s\n",p->name);
printf("学生年龄:%d\n",p->age);
printf("学生的三门成绩:\n");
for(j=0;j<S;j++)
{
printf("%.2f ",p->score[j]);
}
printf("\n");
p++;
}
}
//函数功能:交换两个结构体
//参数1:结构体1的地址 Stu *
//参数2:结构体2的地址 Stu *
//返回值:无
void swap(Stu *p,Stu *q )
{
Stu temp = {0};
temp = *p;
*p = *q;
*q = temp;
}
//函数功能:根据年龄排序
//参数1:开辟的空间的首地址:Stu *
//参数2:学生个数 int
//返回值:无 void
void sort(Stu * p,int count)
{
int i = 0;
int j = 0;
Stu * q = p;
Stu temp = {0};
for(i = 0;i<count-1;i++)
{
q=p;
for(j = 0;j <count-i-1;j++ )
{
if((q+j)->age<(q+j+1)->age)
{
swap((q+j),(q+j+1));
}
}
}
}
//函数功能:根据姓名排序
//参数1:开辟的空间的首地址:Stu *
//参数2:学生个数 int
//返回值:无 void
void sort_name(Stu * p,int count)
{
int i = 0;
int j = 0;
Stu * q = p;
Stu temp = {0};
for(i = 0;i<count-1;i++)
{
q=p;
for(j = 0;j <count-i-1;j++ )
{
if(strcmp((q+j)->name,(q+j+1)->name)>0)
{
swap((q+j),(q+j+1));
}
}
}
}
//函数功能:求成绩总和
//参数1: 数组名:保存成绩的数组的地址:float []
//参数2:学生个数 int
//返回值:成绩总和 sum
float sum(float add[],int count)
{
int i = 0;
float sum = 0;
for(i = 0;i<count;i++)
{
sum += add[i];
}
return sum;
}
//函数功能:根据成绩的总和进行排序
//参数1:开辟的空间的首地址:Stu *
//参数2:学生个数 int
//返回值:无 void
void sort_sum(Stu * p,int count)
{
int i = 0;
int j = 0;
Stu * q = p;
Stu temp = {0};
for(i = 0;i<count-1;i++)
{
q=p;
for(j = 0;j <count-i-1;j++ )
{
if(sum((q+j)->score,count)<sum((q+j+1)->score,count))
{
swap((q+j),(q+j+1));
}
}
}
}
int main()
{
int count = 0;//学生个数
int i = 0;
int list = 0;//选项
menu();
printf("请输入学生的个数:");
scanf("%d",&count);
Stu *p = NULL;//接收malloc的返回值
p = new_address(count);
while(1)
{
printf("请选择功能:");
scanf("%d",&list);
if(list<8&&list>0)
{
if(7 == list)
{
break;
}
switch(list)
{
case 1:
scan(p,count);
break;
case 2:
print(p,count);
break;
case 3:
sort(p,count);
printf("年龄最大的人是:%s\n",p->name);
break;
case 4:
sort(p,count);
print(p,count);
break;
case 5:
sort_name(p,count);
print(p,count);
break;
case 6:
sort_sum(p,count);
print(p,count);
break;
}
}
else
{
printf("当前暂无此功能\n");
break;
}
}
//释放空间
free(p);
p = NULL;
return 0;
}