對於剛接觸C語言編程的人,很多時候會遇到這種情況——“當讓我們處理一個這樣的問題,讓我們存儲或者使用一個大小會隨着使用者的使用情況而改變”,這時很多人就開始抓頭了,不知道如何下手。今天我個人總結了一些有關這方面的解決方案,希望大家能一起完善。
動態數組:
首先,我們一起來看看一組代碼:
#define _CRT_SECURE_NO_DEPRECATE 2 #include<stdio.h> 3 #include<stdlib.h> 4 void create(){ 5 int n, i; 6 int *arr; 7 scanf("%d",&n); 8 arr = (int*)malloc(sizeof(int)*n); 9 for (i = 0; i < n; i++) 10 arr[i] = i; 11 for (i = 0; i < n; i++) 12 printf("%d\t",arr[i]);
13 free(arr); 14 } 15 16 int main(){ 17 create(); 18 return 0; 19 }
從上面的代碼可以看出,對於數組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);
}
這時就可以很方便的使用數組了,不用擔心在使用過程中出現數組溢出的情況了,只需要保證內存足夠就好了。