C语言动态申请内存空间
为什么要动态内存申请 1.定义数组的时候数组的长度是预先定义好的,在整个程序中固定不变; 2.但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 3.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态的分配内存空间,也可把不再使用的空间回收再次利用.
动态申请常用函数
涉及 malloc , calloc , realloc , free四个函数,
头文件:#include <stdlib.h>
1.malloc函数
函数原型:void *malloc (unsigned int num bytes);
返回值:
- 分配成功时:返回分配空间的起始地址
- 分配失败时:返回NULL
特点:
- 对丁malloc的返回值一般要强制类型转换
- malloc申请的空间内容不确定一般使用memset函数进行清空( void *memset(void *str, int c, size_t n) )
2.free函数
函数定义:void free(void *addr) 功能:释放堆区空间 注意addr指向的内存必须是malloc calloc relloc动态申请的内存
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n = 0; int *arr = NULL; printf("请输入数组元素的个数 "); scanf("%d", &n); arr = (int *)malloc(n * sizeof(int)); // 申请堆区空间 memset(arr, 0, n); //对所申请的空间清零 //对arr的读写操作 get_arr(arr, n); print_arr(arr, n); free(arr); //释放空间 printf(" "); } int get_arr(int *arr, int n) { printf("请输入%d个数字 ", n); for (int i = 0; i < n; i++){ scanf("%d", arr + i); } } int print_arr(int *arr, int n) { int i = 0; printf("你输入的为: "); for (i = 0; i < n; i++){ printf("%d ", arr[i]); } }
3.calloc函数
void * calloc(s ize_t nmemb, size_t size);
参数:
- nmemb : 申请的数据块数
- size :每一块大小
- 所以申请总大小 == nmemb* size
返回值:
- 申请成功时:返回申请的内存的首地址
- 申请失败时:返回 NULL
特点:申请的空间自动清零
4.realloc函数重新申请内存)
void* realloc(void *s,unsigned int newsize);
参数:
- s:原先开辟内存的首地址
- newsize:新申请的空间的大小
返回值:新申请的内存的首地址
功能:在原先s指向的内存基础上重新申请内存,新的内存的大小为new_size个字节,如果原先内存后面有足够大的空间,就追加,如果后边的内存不够用,则relloc函数会在堆区找一个newsize个字节大小的内存中请,将原先内存中的内容拷贝过来,然后释放原先的内存,最后返回新内存的地址。
注意:—定要保存realloc的返回值
#include<stdio.h> #include<stdlib.h> int main() { int n = 0, new_n = 0; int *arr = NULL; int i = 0; printf("请输入数组元素的个数 "); scanf("%d", &n); arr = (int *)calloc(sizeof(int), n); // calloc申请的堆区空间,空间自动清零 printf("请输入%d个数字 ", n); for (i = 0; i < n; i++){ scanf("%d", arr + i); } printf("请输入数组元素新增的个数 "); scanf("%d", &new_n); arr = (int *)realloc(arr, (n+new_n) * sizeof(int)); if (new_n > 0){ printf("请输入数组元素新增的元素 "); for (i = n; i < (n + new_n); i++){ scanf("%d", arr + i); } } printf("你输入的为: "); for (i = 0; i < (n + new_n); i++){ printf("%d ", arr[i]); } free(arr); //释放空间 printf(" "); return 0; }
上一篇:
IDEA上Java项目控制台中文乱码