C 语言创建动态数组实现

数组的好处大家都知道,但缺点也很明显,即不能动态改变大小。如果想获得动态改变大小的特性,一般在程序中采用链表的方式来实现。数组和链表满足了我们大多数的应用需求。但也有时候,我们想利用数组能快速查找的特点而不希望用链表,但是数组在每次使用的时候,大小又是变化的。今天1000,明天可能就是10000了。因此,就需要创建动态数组,在c语言中,这是可以实现的,主要涉及到malloc()函数,即动态分配内存操作。


下面是我自己写得一段代码,能完成基本的功能:每次输入数组的长度,然后输入相应的数据,就可以以数组形式保持内容了。

写得比较简略,有的地方也不严谨,今天放到这里,希望大家帮我找找错误,这样做是否是安全的?比如在内存使用方面?希望得到大家的指导。


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

#include<malloc.h>



void show(int *p, int n){
int i;
for(i=0;i<n;i++)
printf("%d\n",*(p+i));
}


main(){
int *my_array,num;


printf("input the length of your danymic array!\n");


scanf("%d",&num);


printf("input %d numbers \n",num);

my_array = (int *)malloc((num+1)*sizeof(int));


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

printf("%d numbers have been added!\n",num);


show(my_array,num);


free(my_array);


my_array=NULL;



}

### 使用 `malloc` 和 `free` 创建和管理 C 语言中的动态数组 #### 动态分配内存的基础概念 在C语言中,`malloc()` 函数用于请求一块指定大小的连续内存空间。该函数返回指向这块新分配区域的指针。如果无法获得所求的空间,则返回NULL[^1]。 #### 正确声明并初始化动态数组 为了创建一个整型动态数组,应当按照如下方式操作: ```c #include <stdio.h> #include <stdlib.h> // 假设要创建长度为 size 的 int 类型数组 size_t size = 10; int *array = (int *)malloc(size * sizeof(int)); ``` 这段代码首先包含了必要的头文件 `<stdlib.h>` 来访问标准库函数 `malloc()` 。接着定义了一个变量 `size` 表示所需数组元素的数量,并通过 `(int *)malloc(...)` 对其进行了强制类型转换以匹配目标数据类型的指针形式。最后乘上单个元素占用字节数来计算总需求量[^3]。 #### 安全检查与错误处理 考虑到可能出现内存不足的情况,在实际应用中应该加入对返回值的有效性验证: ```c if (array == NULL){ fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } ``` 上述片段展示了当 `malloc()` 返回的结果为空时应采取的动作——打印一条消息到标准错误流并终止程序执行[^2]。 #### 访问及修改动态数组的内容 一旦成功获取到了一段可用的存储区段,就可以像对待常规静态数组那样对其进行读写操作了: ```c for (size_t i = 0; i < size; ++i) { array[i] = i * i; // 给每个位置赋初值 } printf("Elements of the dynamic array:\n"); for (size_t i = 0; i < size; ++i) { printf("%d ", array[i]); } puts(""); ``` 这里利用循环结构遍历整个序列完成填充工作;随后再次迭代输出全部成员供查看。 #### 释放不再使用的资源 为了避免潜在的内存泄漏问题,在结束对该部分缓冲区的操作之后务必调用 `free()` 将之前保留下来的地址交还给操作系统: ```c free(array); array = NULL; /* Good practice to avoid dangling pointer */ ``` 这一步骤非常重要,因为它不仅有助于保持系统的稳定性,还能防止其他地方误引用已经失效的对象实例[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值