# 动态内存分配与释放:malloc和free函数的使用
## 1. 动态内存分配
动态内存分配是在程序运行时根据需要分配和释放内存空间。C语言提供了两个主要的函数用于动态内存分配:malloc和free。
### 1.1 malloc函数
malloc函数用于动态分配指定字节数的内存空间,并返回分配的内存空间的首地址。
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr;
int size = 5;
// 动态分配内存空间
ptr = (int*)malloc(size * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 使用动态分配的内存空间
for (int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
// 输出动态分配的内存空间的值
for (int i = 0; i < size; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放动态分配的内存空间
free(ptr);
return 0;
}
```
输出结果:
```
1 2 3 4 5
```
### 1.2 sizeof运算符
sizeof运算符用于获取数据类型或变量的字节大小,常用于动态内存分配时计算所需的字节数。
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr;
int size;
printf("请输入数组的大小:");
scanf("%d", &size);
// 动态分配内存空间
ptr = (int*)malloc(size * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 使用动态分配的内存空间
for (int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
// 输出动态分配的内存空间的值
for (int i = 0; i < size; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放动态分配的内存空间
free(ptr);
return 0;
}
```
输出结果:
```
请输入数组的大小:6
1 2 3 4 5 6
```
## 2. 内存释放
使用动态内存分配函数分配的内存空间在使用完毕后应当及时释放,以避免内存泄漏和资源浪费。
### 2.1 free函数
free函数用于释放之前动态分配的内存空间,使其
可供系统重新使用。
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr;
int size = 5;
// 动态分配内存空间
ptr = (int*)malloc(size * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 使用动态分配的内存空间
for (int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
// 输出动态分配的内存空间的值
for (int i = 0; i < size; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放动态分配的内存空间
free(ptr);
// 尝试访问已释放的内存空间(未定义行为)
for (int i = 0; i < size; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
return 0;
}
```
输出结果:
```
1 2 3 4 5
-842150451 -842150451 -842150451 -842150451 -842150451
```
注意:在释放内存空间后,尽量避免继续使用已释放的指针,因为它们不再指向有效的内存空间,访问已释放的内存空间将导致未定义的行为。
以上是关于动态内存分配与释放的详细教程。动态内存分配可以根据程序运行时的需要灵活地分配和释放内存空间,提高了程序的灵活性和效率。然而,需要注意合理使用动态内存分配,避免内存泄漏和指针悬挂的问题。