Contents
  1. 1. calloc()和malloc()函数
    1. 1.1. calloc()
    2. 1.2. malloc()
    3. 1.3. sizeof运算符
    4. 1.4. 小案例
  2. 2. 动态链表C语言实现

在正式创建一个动态链表之前,先来看C语言中用来动态分配内存的calloc()malloc()函数。

calloc()和malloc()函数

calloc()和malloc()是标准C库中提供了两个函数,用于在运行时分配堆内存。他们都在标准头文件<stdlib.h>中声明,所以,如果要使用这两个动态内存分配函数,应用程序必须包含这个头文件。

如果分配成功,将返回void(C语言中通用指针类型)类型指针,指向刚分配的内存空间;如果分配失败,则返回NULL

calloc()

calloc()函数接收两个参数,指定要提供元素个数以及每个元素的大小(字节数),并且返回指向给内存开头区域的指针

1
2
#include <stdlib.h>
void *calloc(size_t num, size_t size);

calloc()函数返回的指针类型为void,所以通常我们需要将其强制转换为适当类型的指针。

其存储区域将被自动设定为0

malloc()

malloc()函数和calloc()工作方式相似,不过它只接收一个参数:所分配空间的总字节数

另外,其存储区域不会自动设定为0

1
2
#include <stdlib.h>
void *malloc(size_t size);

sizeof运算符

sizeof用起来像一个函数,但它实际上是一个运算符,其以字节为单位返回指定项目的大小

1
2
sizeof(int) // 4
sizeof(struct student)

小案例

回到动态分配内存的话题,如果希望在程序中为1000个整数分配足够的内存,我们有以下两种方式:

1
2
3
4
5
6
7
8
9
#include <stdlib.h>
int *intp;
/*使用calloc()*/
intp = (int *)calloc(sizeof(int), 1000);
/*使用malloc()*/
intp = (int *)malloc(1000*sizeof(int));

动态链表C语言实现

现在可以来实现一个创建单链表的函数,让用户输入节点信息,并且以student.age=0作为结束。最后在主函数中,打印出所有的节点信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
/*定义一个名为student的结构体*/
struct student {
char name[20];
int age;
struct student *next;
};
/*创建一个动态链表,其返回值为头指针*/
struct student * create () {
typedef struct student stu_t;
stu_t *head, *p1, *p2; //head为头指针,p1总指向最后一个节点,p2指向p1前一个节点
head = p1 = p2 = (stu_t *)malloc(sizeof(stu_t)); //创建第一个节点,并且让head、p1、p2均指向第一个节点
scanf("%s %d", p1->name, &p1->age); //输入第一个节点信息,并将其赋值给第一个节点
/*添加新节点*/
while (p1->age != 0) {
p2 = p1; // p1要去指向新节点,p2指向p1原来指向的节点
p1 = (stu_t *)malloc(sizeof(stu_t)); // p1指向新开辟的节点
p2->next = p1; // 上一个节点的next指向新节点
scanf("%s %d", p1->name, &p1->age); // 输入信息并赋值给新节点
}
p1->next = NULL; // 将最后一个节点的next置为空
return head; // 返回头指针
};
int main () {
struct student *s;
s = create();
while (s->next != NULL) {
printf("name=%s,age=%d\n", s->name, s->age);
s = s->next;
}
return 0;
}

运行结果如下:

这样就实现了动态链表的创建,关于链表的增加、删除等功能,后期再逐渐完善。

Contents
  1. 1. calloc()和malloc()函数
    1. 1.1. calloc()
    2. 1.2. malloc()
    3. 1.3. sizeof运算符
    4. 1.4. 小案例
  2. 2. 动态链表C语言实现