跳到主要内容

C 语言动态内存分配

提示
  1. 动态内存分配的基本概念:在C语言中,动态内存分配允许程序在运行时分配和调整所需内存的大小,常用的函数包括malloc(), calloc(), realloc()free()
  2. malloc()calloc()函数malloc()分配指定大小的内存块,而calloc()除了分配内存外还会初始化所有位为零。
  3. 使用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