C 语言动态内存分配
提示
- 动态内存分配的基本概念:在C语言中,动态内存分配允许程序在运行时分配和调整所需内存的大小,常用的函数包括
malloc()
,calloc()
,realloc()
和free()
。 malloc()
和calloc()
函数:malloc()
分配指定大小的内存块,而calloc()
除了分配内存外还会初始化所有位为零。- 使用
free()
和realloc()
:free()
函数用于释放已分配的内存,realloc()
函数用于更改已分配内存的大小。
正如您所知,数组是固定数量值的集合。一旦声明了数组的大小,您就不能更改它。
有时您声明的数组大小可能不足。为了解决这个问题,您可以在运行时手动分配内存。这在C编程中被称为动态内存分配。
为了动态分配内存,使用了malloc()
、calloc()
、realloc()
和free()
这些库函数。这些函数定义在<stdlib.h>
头文件中。
C malloc()
"malloc"的名称代表内存分配。
malloc()
函数为指定数量的字节预留一块内存块。并且,它返回一个void
类型的指针,可以转换为任何形式的指针。
malloc()的语法
ptr = (castType*) malloc(size);
示例
ptr = (float*) malloc(100 * sizeof(float));
上述语句分配了400字节的内存。这是因为float
的大小是4字节。而指针ptr保存了分配内存中第一个字节的地址。
如果内存不能分配,表达式结果为NULL
指针。
C calloc()
"calloc"的名称代表连续分配。
malloc()
函数分配内存并保留未初始化的内存,而calloc()
函数分配内存并将所有位初始化为零。
calloc()的语法
ptr = (castType*)calloc(n, size);
示例:
ptr = (float*) calloc(25, sizeof(float));
上述语句为25个float
类型的元素分配了连续的内存空间。
C free()
使用calloc()
或malloc()
创建的动态分配内存不会自动释放。您必须显式使用free()
来释放空间。
free()的语法
free(ptr);
此语句释放指针ptr
指向的内存空间。
示例1:malloc()和free()
// 程序计算用户输入的n个数字的总和
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("输入元素个数: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int));
// 如果无法分配内存
if(ptr == NULL) {
printf("错误!内存未分配。");
exit(0);
}
printf("输入元素: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("总和 = %d", sum);
// 释放内存
free(ptr);
return 0;
}
输出
输入元素个数: 3
输入元素: 100
20
36
总和 = 156
这里,我们为n个int
动态分配了内存。
示例2:calloc()和free()
// 程序计算用户输入的n个数字的总和
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, *ptr, sum = 0;
printf("输入元素个数: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int));
if(ptr == NULL) {
printf("错误!内存未分配。");
exit(0);
}
printf("输入元素: ");
for(i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("总和 = %d", sum);
free(ptr);
return 0;
}
输出
输入元素个数: 3
输入元素: 100
20
36
总和 = 156
C realloc()
如果动态分配的内存不足或超出所需,您可以使用realloc()
函数更改之前分配内存的大小。
realloc()的语法
ptr = realloc(ptr, x);
这里,ptr用新大小x重新分配。
示例3:realloc()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr, i , n1, n2;
printf("输入大小: ");
scanf("%d", &n1);
ptr = (int*) malloc(n1 * sizeof(int));
printf("之前分配的内存地址:\n");
for(i = 0; i < n1; ++i)
printf("%pc\n",ptr + i);
printf("\n输入新的大小: ");
scanf("%d", &n2);
// 重新分配内存
ptr = realloc(ptr, n2 * sizeof(int));
printf("新分配的内存地址:\n");
for(i = 0; i < n2; ++i)
printf("%pc\n", ptr + i);
free(ptr);
return 0;
}
输出
输入大小: 2
之前分配的内存地址:
26855472
26855476
输入新的大小: 4
新分配的内存地址:
26855472
26855476
26855480
26855484