C语言中,用malloc() realloc()动态分配内存,实现读入与输出、更新、尾部插入元素
malloc()是动态内存分配函数,用来向系统请求分配内存空间。当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。
与其配套的是free(),当申请到的空间不再使用时,要用free()函数将内存空间释放掉,这样可以提高资源利用率,最重要的是----就是因为它可以申请内存空间,然后根据需要进行释放,才被称为“动态内存分配”!
详细每一句的实现原理已经写在程序的注释里啦~
完整程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
int read();
int update();
int end_insert();
int length = 0;
int *array = NULL; 定义array的空指针,全局变量
int main(void)
{
int mode = 0;
printf("请输入数组的长度:");
scanf_s("%d", &length);
printf("您输入数组的长度为:%d\n\n", length);
array = (int *) malloc(sizeof(int) * length); //创建一段动态内存空间,创建后用法与数组一样
if (array == NULL)
{
printf("内存申请失败,程序退出\n");
exit(-1);
}
for (int i = 0; i < length; i++)
{
printf("请输入array[%d]的值:", i);
scanf_s("%d", array + i);
}
printf("\n您输入的数组为:\n");
for (int i = 0; i < length; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
printf("\n请输入你的操作模式:1.读取元素 2.更新元素 3.尾部插入\n");
scanf_s("%d", &mode);
switch (mode)
{
case 1:
{
printf("读取元素\n");
read();
break;
}
case 2:
{
printf("更新元素\n");
update();
break;
}
case 3:
{
printf("尾部插入\n");
end_insert();
break;
}
default:
printf("False!\n");
}
free(array); //释放array所指的内存空间
array = NULL; //养成好习惯,指针用完赋值NULL
system("pause");
return 0;
}
int read()
{
int i;
printf("\n您要查询元素下标是?\n");
scanf_s("%d", &i);
if (i > length - 1)
{
printf("False! Out of list!\n");
exit(-1);
}
else
printf("数组array[%d] = %d\n\n", i, *(array + i));//读取元素
}
int update()
{
int i, num;
printf("\n您要更新元素下标是?\n");
scanf_s("%d", &i);
if (i > length - 1)
{
printf("False! Out of list!\n");
exit(-1);
}
else
{
printf("\n新的数值是?\n");
scanf_s("%d", &num);
*(array + i) = num;
for (int i = 0; i < length; i++)
{
printf("array[%d] = %d\n", i, *(array + i));
}
}
}
int end_insert()
{
int num;
printf("\n您要插入的数值是?\n");
scanf_s("%d", &num);
length = length + 1;
realloc(array, sizeof(int) * length); //对内存空间进行扩容
if (array == NULL)
{
printf("内存申请失败,程序退出\n");
exit(-1);
}
array[length-1] = num;
for (int i = 0; i < length; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
}
输出: