动态分配内存函数及链表的创建

内存分配有静态内存分配和动态内存分配两种,静态内存分配是在程序编译的过程中已经确定了内存的大小,例如数组,这种的缺点就是你静态开辟的内存有时可能过大造成资源浪费,有时过小造成内存不足,下面先首先介绍下常见的动态内存分配函数(动态分配都在堆中):
(这些函数都需要头文件#include或者#include编译器的不同所导致)
1.malloc():
void * malloc(size),这个函数的参数是表示内存大小的 int 型size,返回值是void的类型的指针,一般需要强制转换成目标结构体或者类的指针,会在堆中分配一个长度为size的连续空间,事实上malloc分配的不止是size大小的空间,因为其内部还有头部信息(32)尾部信息(4)这两者,因此算的话就把这两个加上就好了,具体不做深究,malloc()不会对分配的内存进行初始化,这就是它和calloc()的区别;一般都要和free()函数搭配;
2.free():
free()函数用于释放动态分配的内存,参数为指向该内存首地址的指针,将指向内存的指针free掉后,要把这个指针指向“null”;
3.calloc():
用法和malloc()基本一直唯一的不同是calloc()会给分配的内存初始化为0;
4realloc():
参数有两个,第一个是已经分配内存的指针,第二个是要追加的内存大小,这个函数的返回值仍然是void指针,还是要强制转换成指定类型的指针,注意再realloc后第一个指针参数指的内存就已经被free了,取而代之的是追加后的内存所以在free只需要对第二个指针进行free就可以了。
链表:
链表的概念大致为,一个类或者结构体中有数据元素和一个该类的指针,作用是指向下一个元素,你可以想象为一个抽屉里面有你想找的东西(数据)和一个小纸条上面写着你要的东西在那个抽屉里,这样连锁起来;
链表的基本建立和链表的输出:


#include 
 #include 
 #define null 0
 #define size sizeof(struct student)
 using namespace std;
 struct student{
  int grade;//这里可以加更多的成员 grade只是个代表而已
 struct student * next;
};
struct student * create(int n){
 struct student *head,*node,*end;//创建头节点一般节点和尾节点
 head = (struct student *)malloc(size);//因为malloc函数返回的是void类型的指针所以把它强转成student类型的指针
 end = head;//空链表头就是尾
 for(int i=1;i<=n;i++){
  node = (struct student *)malloc(size);
  cin>>node->grade;//输入数据
  end->next = node;//尾指向node
  end = node;//node变成尾
}
return (head);
}
void show(struct student *p,int n){
    struct student * a = p->next;//head节点没有数据,所以先转向第一个有数据的节点
 while(a!=null){
        cout<grade<next;
 }
}
int main(){
 struct student *p;
 int n;
 cin>>n;
 p =create(n);
 show(p,n);
 return 0;
}

以上做法就优化的数组的不足,这个动态链表可以根据你想要的数据个数来动态的创建节点个数,没有数组那么死板了。
补充c++空指针的定义:
#define null 0

你可能感兴趣的:(动态分配内存函数及链表的创建)