C54-动态开辟内存空间
1.malloc
-
原型:
void* malloc(size_t size);
(位于<stdlib.h>
头文件中) -
作用:分配一块连续的、未初始化的内存块,大小为
size
字节。 -
返回值:
- 成功:返回指向分配内存首地址的
void*
指针(需强制类型转换后才能使用)。 - 失败(如内存不足):返回
NULL
。
- 成功:返回指向分配内存首地址的
-
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p; // 1. 声明一个 char 类型的指针 pp=(char *)malloc(1); // 2. 动态分配 1 字节的内存,并将地址赋给 p*p= 'c'; // 3. 将字符 'c' 存储到 p 指向的内存中printf("%c\n",*p);p=(char *)malloc(12);strcpy(p,"Hello!");printf("%s",p);return 0;
}
- 成果展示:
2.realloc
作用:调整动态内存块大小(扩大/缩小)。
原型:
void *realloc(void *ptr, size_t new_size);
ptr
:原内存指针。new_size
:新大小(字节)。若为0
且ptr
非空,等同free
。
关键点:
- 可能移动内存:若原位置空间不足,会分配新内存并复制数据。
示例:
int *arr = malloc(5 * sizeof(int));
arr = realloc(arr, 10 * sizeof(int)); // 扩容到10个int
free(arr);
- 代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p; p=(char *)malloc(7);strcpy(p,"Hello!");printf("%s\n",p);printf("扩容前地址:%p\n",p);free(p); p=NULL;int len;len=strlen("若原位置空间不足,会分配新内存并复制数据");p=realloc(p,len+1);strcpy(p,"若原位置空间不足,会分配新内存并复制数据");printf("%s\n",p);printf("扩容后地址:%p\n",p);return 0;
}
- 成果展示:
3.free
作用:释放 malloc
/calloc
/realloc
分配的动态内存,防止内存泄漏。
用法:
void free(void *ptr); // ptr 必须是动态分配的内存地址
关键点:
- 必须配对使用:每个
malloc
都要对应一个free
。 - 避免悬空指针:释放后指针应置
NULL
(ptr = NULL
)。 - 禁止重复释放:对同一内存多次
free
会导致崩溃。 - 仅用于动态内存:静态数组(如
int a[10]
)不可free
。
示例:
int *p = malloc(10 * sizeof(int));
if (p != NULL) { // 使用内存... free(p); p = NULL; // 安全操作
}
4.memset
功能
快速将某块内存的所有字节设为指定值(按字节填充)。
函数原型
void *memset(void *ptr, int value, size_t num);
ptr
:目标内存首地址(如数组、结构体)。value
:填充值(实际取低8位,范围0~255)。num
:填充的字节数(通常用sizeof
计算)。- 返回值:返回
ptr
本身。
常用场景
-
清零内存(最安全):
int arr[10]; memset(arr, 0, sizeof(arr)); // 所有字节置0
- 代码示例:
#include <stdio.h>
#include <string.h>int main()
{int arr[10]={1,2,3,4,};memset(arr,0,sizeof(arr));for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
- 成果展示:
-
填充字符数组:
char str[10]; memset(str, 'A', 5); // 前5字节设为'A'(需手动补'\0')
- 代码示例:
#include <stdio.h>
#include <string.h>int main()
{char arr[10];memset(arr,'S',5);for(int i=0;i<10;i++){printf("%c ",arr[i]);}return 0;
}
- 成果展示: