对于刚接触 C 语言编程的人, 很多时候会遇到这种情况 --"当让我们处理一个这样的问题, 让我们存储或者使用一个大小会随着使用者的使用情况而改变", 这时很多人就开始抓头了, 不知道如何下手. 今天我个人总结了一些有关这方面的解决方案, 希望大家能一起完善.
动态数组:
首先, 我们一起来看看一组代码:
- #define _CRT_SECURE_NO_DEPRECATE
- #include
- #include
- void create(){
- int n, i;
- int *arr;
- scanf("%d",&n);
- arr = (int*)malloc(sizeof(int)*n);
- for (i = 0; i < n; i++)
- arr[i] = i;
- for (i = 0; i < n; i++)
- printf("%d\t",arr[i]);
- free(arr);
- }
- int main(){
- create();
- return 0;
- }
从上面的代码可以看出, 对于数组 arr[], 其使用大小是有我们个人输入的, 而不是一开始就给定了的, 所以很大程度上解决了给定大小更改大小的麻烦.
而这里它使用的就是 C 语言中最常使用的 malloc 函数, 为 arr 开辟空间, 但是开辟了空间一定要记着给 free() 了, 不然你的内存就会因为这些东西给占满.
其次, 二维动态数组:
- void create(){
- int n=3, m=4;
- int** a;
- a = (int**)malloc(sizeof(int*)*n);// 创建一个指针数组, 把指针数组的地址赋值给 a
- for (int i = 0; i < n; i++)
- a[i] = (int*)malloc(sizeof(int)*m);// 给第二维分配空间
- for (int i = 0; i < n; i++){
- for (int j = 0; j < m; j++)
- a[i][j] = i + j;
- }
- for (int i = 0; i < n; i++){
- for (int j = 0; j < m; j++)
- printf("%d\t",a[i][j]);
- printf("\n");
- }
- }
- int main(){
- create();
- return 0;
- }
简单的说就是按照二维数组的思想, 把二维数组看成一个拥有多个数据的一维数组, 从而模仿一维数组的方式进行建立即可, 这里采用指针的指针的方式来进行进一步的创建.
接下来便是对于, 当我们首先建立的数组大小满了的时候的这种情况的解决方案. 请看代码:
- if (i == n) {
- // 判断是否数组已经满了, 如果满了, 进行如下操作
- // 第一步 申请一块更大的内存空间 新空间是旧空间的两倍
- int* newSpace = (int*)malloc(sizeof(int) * n) * 2);
- // 第二步 拷贝数据到新建的空间
- memcpy(newSpace, arr, n* sizeof(int));
- // 第三步 释放旧空间的内存
- free(arr);
- }
这时就可以很方便的使用数组了, 不用担心在使用过程中出现数组溢出的情况了, 只需要保证内存足够就好了.
来源: http://www.bubuko.com/infodetail-3175887.html