C语言动态数组搭建

C语言可能会有这样的一种错误写法在搭建动态数组时

如图所示

    int size;
	scanf_s("%d", &size);
	int num[size] = {};
	for (int i = 0; i < size; i++)
	{
		scanf_s("%d", num[i]);
	}

一旦进行上述编写编译器会进行报错

 一.根据客户需要生成长度可变的动态数组

C语言<stdlib.h>头文件中提供了动态内存分配函数,可以利用动态内存分配函数进行动态数组的搭建。

1.函数malloc()

malloc函数用于分配若干字节的内存空间,返回一个指向该内存首地址(动态数组)的指针

提示:若系统不能提供足够的内存单元,函数将返回NULL空指针

malloc函数的使用方法:

	int* arr = NULL, size;
	printf("一共有几个数:");
	scanf_s("%d", &size);
	arr = (int*)malloc(size * sizeof(int));

提示:1.先定义一个指针变量储存动态数组的首地址

           2.(int*)是定义一个int类型的动态数组

           3.malloc(size*sizeof(int))指申请了size个int类型字节的存储空间,可根据需要进行             改变例如将int改成float

2.calloc()函数

calloc函数用于分配若干字节的内存空间,并赋值为零

函数原型

void*calloc(num,size);
calloc函数的使用方法:

    int size;
	scanf_s("%d", &size);
	int* p = NULL;
	p = (int*)calloc(size,sizeof(int));
	if (p == NULL)
	{
		exit(1);
	}

提示:1.calloc不同于malloc函数,calloc拥有两个参数,第一个size参数决定一维数组的大小,                第二个参数表示申请每个空间的字节数,确定数组元素的类型。

           2.从安全角度考虑使用calloc函数更明智因为与malloc函数不同的是calloc函数能 自动将                  分配的内存初始化为0。

3.free()函数

free()函数的功能是释放向系统动态申请的由指针p指向的储存空间

函数原型:free(*p)

动态一维数组搭建实例:找出输入所有数字中的正数

#include<stdio.h>
#include<stdlib.h>
#define NULL 0
int PositiveNum(int a[], int n)
{
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		int ag = a[i];
		if (ag > 0)
			count++;
	}
	return count;
}
void fun(int* arr, int size)
{
	for (int i = 0; i < size; i++)
		scanf_s("%d", &arr[i]);
}
int main(void)
{
	int* arr = NULL, size;
	printf("请输入一共有几个数:");
	scanf_s("%d", &size);
	arr = (int*)malloc(size * sizeof(int));//开辟申请空间
	if (arr == NULL)
	{
		exit(1);
	}
	fun(arr, size);
	printf("共有正数%d个", PositiveNum(arr, size));
	free(arr);
	return 0;
}

 4.realloc()函数

提示:realloc函数可用于改变原来分配的储存空间的大小

指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)

	int m, n;//班级数(行数),学生数(列数)
	printf("请输入班级数和学生数:\n");
	scanf_s("%d,%d", &m, &n);
	int* p = NULL;
	p = (int*)calloc(m*n, sizeof(int));
	int newsize;
	printf("加几个班");
	scanf_s("%d", &newsize);
	int *map=(int*)realloc(p, newsize);

函数的返回值是新分配的存储空间的首地址,与原来的地址不一定相同,所以要定义一个新的指针变量来储存该数组的首地址。

二.长度可变的二维动态数组

二维动态数组的搭建与一维动态数组的搭建类似,下面举一个例子

输入班级数学生数并进行计算总的平均分

#include<stdio.h>
#include<stdlib.h>
//函数功能:输入学生成绩
void Input(int* p, int m, int n)
{
	for (int x = 0; x < m; x++)
		for (int y = 0; y < n; y++)
		{
			scanf_s("%d", &p[x * m + n]);
			if (y == (n - 1))
			{
				printf("\n______________________\n");
			}
		}
}
//函数功能:求平均值
float aver(int* p, int m, int n)
{
	float num=0.0;
	for (int x = 0; x < m; x++)
		for (int y = 0; y < n; y++)
		{
			num += (float)p[x * m + n];
		}
	return num / ((float)(m * n));
}
//二维动态数组的搭建
int main(void)
{
	int m, n;//班级数(行数),学生数(列数)
	printf("请输入班级数和学生数:\n");
	scanf_s("%d,%d", &m, &n);
	int* p = NULL;
	p = (int*)calloc(m*n, sizeof(int));
	if (p == NULL)
	{
		exit(1);
	}
	Input(p, m, n);
	printf("两个班所有学生的平均分是%f", aver(p, m, n));
	return 0;
}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茁@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值