【malloc函数 创建动态数组】

     亲爱的盆友们大家好,我们都知道,在C语言中如果要使用数组,就必须提前设置好数组大小

eg: int arr[100], char arr[100], 不能设置 int arr[ ]    否则电脑会报错,

因为电脑比较“笨”,咱们不告诉它,它就不知道应该给数组分配多少内存空间。

(有一个不算例外的例外:char arr[ ] =" I Love China! " 这是个字符串,初始化的时候系统会自动计算大小,并且不可以进行更改)

不过在c语言,c++中,可以通过malloc函数来创建动态数组,

malloc 向系统申请分配指定内存空间:size个字节。返回类型是 未指定类型的指针 :void* 类型

————调用头文件 #include<stdlib.h>

#include<stdio.h>
#include<stdlib.h>

————malloc函数实例化:

1、   指针

int*p1 =(int*)malloc(sizeof(int));

(int *) 为强制类型转换,将 (void*) 转换为整形指针

(sizeof(int)) 为分配内存大小,一个整形大小(4个字节)

2、数组

int* arr = (int*)malloc(n * sizeof(int));

(n * sizeof(int)) 同上,为分配 n * 4 的字节内存大小

arr指向数组首地址

和arr[10]中  arr 为 arr[0] 的地址 用法相同

    //       1、创建整形指针
int*p1 =(int*)malloc(sizeof(int));
    //        字符型指针
char *p2=(char*)malloc(sizeof(char));
char *p2=(char*)malloc(1);


    //		2、创建数组arr[]
	int* arr = (int*)malloc(n * sizeof(int));

————数据排序

//		数组按照从小到大的顺序输出		插入法排序
	for ( i = 1; i < n; i++)
	{
		int z = arr[i];
		for ( j = i - 1; j >= 0; j--)
		{
			if (z < arr[j])
			{	//		将大数向后移动一位(此时两个数相同),方便 z 的插入(覆盖前数)
				arr[j + 1] = arr[j];
			}
			else
				break;
		}
		//		arr[i] <= arr[j],将 z 覆盖到 arr[j+1]
			arr[j + 1] = z;
	}

————内存释放

通过free(arr);

手动释放掉 arr[n]所占用的内存

(其实咱们不释放它也没关系的,函数执行完毕后,系统会帮我们释放掉的,不过啊,

虽然电脑每天任劳任怨、毫无怨言,可是如果它那天“心情不好”,冷不丁地给咱们报个错,那咱上呢说理啊,哈哈)

所以呢大家还是动动发财手把代码写完整比较好哦。

————完整代码实例

						//		创建动态数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i, j;
	//		输入数组大小
	int n;
	printf("请输入数组大小:");
	scanf_s("%d", &n);
	//		创建数组arr[]
	int* arr = (int*)malloc(n * sizeof(int));
	for ( i = 0; i < n; i++)
		scanf_s("%d", &arr[i]);
	//		插入法排序
	for ( i = 1; i < n; i++)
	{
		int z = arr[i];
		for ( j = i - 1; j >= 0; j--)
		{
			if (z < arr[j])
			{	
				arr[j + 1] = arr[j];
			}
			else
				break;
		}
			arr[j + 1] = z;
	}

	for (i = 0; i < n; i++)
		printf("%d ", arr[i]);
	printf("\n");
	//		释放数组
	free(arr);
	return 0;
}

        我也是一名大一学生,无意看到了这个有趣的动态数组,就想来说一说自己的理解,

在帮助其他朋友的同时也可以巩固自己,十分欢迎各位朋友、大佬在评论区发表见解以及指正不足。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值