快捷搜索: 王者荣耀 脱发

C语言动态申请内存空间

为什么要动态内存申请 1.定义数组的时候数组的长度是预先定义好的,在整个程序中固定不变; 2.但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 3.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态的分配内存空间,也可把不再使用的空间回收再次利用.

动态申请常用函数

涉及 malloc , calloc , realloc , free四个函数,

头文件:#include <stdlib.h>

1.malloc函数

函数原型:void *malloc (unsigned int num bytes);

返回值:

  1. 分配成功时:返回分配空间的起始地址
  2. 分配失败时:返回NULL

特点:

  1. 对丁malloc的返回值一般要强制类型转换
  2. 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);

参数:

  1. nmemb : 申请的数据块数
  2. size :每一块大小
  3. 所以申请总大小 == nmemb* size

返回值:

  1. 申请成功时:返回申请的内存的首地址
  2. 申请失败时:返回 NULL

特点:申请的空间自动清零

4.realloc函数重新申请内存)

void* realloc(void *s,unsigned int newsize);

参数:

  1. s:原先开辟内存的首地址
  2. 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;
}
经验分享 程序员 微信小程序 职场和发展