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项目控制台中文乱码
