C语言教程-在C语言中的动态内存分配
在C语言中,动态内存分配的概念使得C程序员可以在运行时分配内存。C语言中的动态内存分配可以通过stdlib.h头文件中的4个函数来实现。
- malloc()
- calloc()
- realloc()
- free()
在学习上述函数之前,让我们先了解静态内存分配和动态内存分配之间的区别。
静态内存分配 | 动态内存分配 |
---|---|
在编译时分配内存 | 在运行时分配内存 |
程序执行时无法增加内存 | 程序执行时可以增加内存 |
用于数组 | 用于链表 |
现在让我们快速了解一下用于动态内存分配的方法。
malloc() | 分配单个请求的内存块。 |
---|---|
calloc() | 分配多个请求的内存块。 |
realloc() | 重新分配malloc()或calloc()函数占用的内存。 |
free() | 释放动态分配的内存。 |
malloc()函数
malloc()函数分配单个请求的内存块。
在执行时不会初始化内存,所以初始时内存中有垃圾值。
如果内存不足,则返回NULL。
malloc()函数的语法如下:
ptr = (cast-type*) malloc(byte-size);
让我们看一个malloc()函数的例子:
#include<stdio.h>
#include<stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int)); // 使用malloc分配内存
if (ptr == NULL) {
printf("Sorry! unable to allocate memory");
exit(0);
}
printf("Enter elements of array: ");
for (i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum=%d", sum);
free(ptr); // 释放内存
return 0;
}
输出结果如下:
Enter number of elements: 3
Enter elements of array: 10
10
10
Sum=30
calloc()函数
calloc()函数分配多个请求的内存块。
它会将所有字节的初始值设置为零。
如果内存不足,则返回NULL。
calloc()函数的语法如下:
ptr = (cast-type*) calloc(number, byte-size);
让我们看一个calloc()函数的例子:
#include<stdio.h>
#include<stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int)); // 使用calloc分配内存
if (ptr == NULL) {
printf("Sorry! unable to allocate memory");
exit(0);
}
printf("Enter elements of array: ");
for (i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum=%d", sum);
free(ptr); // 释放内存
return 0;
}
输出结果如下:
Enter number of elements: 3
Enter elements of array: 10
10
10
Sum=30
realloc()函数
如果malloc()或calloc()函数的内存不足,可以通过realloc()函数重新分配内存。简而言之,它改变了内存的大小。
realloc()函数的语法如下:
ptr = realloc(ptr, new-size);
free()函数
malloc()或calloc()函数分配的内存必须通过调用free()函数释放。否则,它将占用内存,直到程序退出。
free()函数的语法如下:
free(ptr);