想在 C 語言裡面使用動態陣列還真是有點複雜。在這裡提供用指標實作一維陣列、二維陣列與三維陣列的範例。已盡量寫成簡易形式,就算不太了解其中原理也能輕鬆修改,歡迎有需要的朋友直接拿去用。
動態一維陣列
/* * 動態陣列 char array[xSize] 的範例 * 應用時,只需修改「設定陣列型態」、「設定陣列大小」與「使用陣列」的地方即可。 */ #include <stdio.h> #include <stdlib.h> int main() { int xSize; char *array; /* 設定陣列型態 */ /* 設定陣列大小 */ xSize = 2; /* 配置一維陣列 */ array = calloc(xSize, sizeof(*array)); if (array == NULL) { fprintf(stderr, "記憶體不足。\n"); exit(1); } /* 使用一維陣列 */ array[1] = 0; printf("%d\n", array[1]); /* 釋放一維陣列 */ free(array); return 0; }
動態二維陣列
/* * 動態陣列 char array[xSize][ySize] 的範例 * 應用時,只需修改「設定陣列型態」、「設定陣列大小」與「使用陣列」的地方即可。 */ #include <stdio.h> #include <stdlib.h> int main() { int i; int xSize; int ySize; char **array; /* 設定陣列型態 */ /* 設定陣列大小 */ xSize = 2; ySize = 3; /* 配置二維陣列 */ array = calloc(xSize, sizeof(void *)); if (array == NULL) { fprintf(stderr, "記憶體不足。\n"); exit(1); } array[0] = calloc(xSize * ySize, sizeof(**array)); if (array[0] == NULL) { fprintf(stderr, "記憶體不足。\n"); free(array); exit(1); } for (i = 1; i < xSize; ++i) { array[i] = array[0] + ySize * i; } /* 使用二維陣列 */ array[1][2] = 0; printf("%d\n", array[1][2]); /* 釋放二維陣列 */ free(array[0]); free(array); return 0; }
動態三維陣列
/* * 動態陣列 char array[xSize][ySize][zSize] 的範例 * 應用時,只需修改「設定陣列型態」、「設定陣列大小」與「使用陣列」的地方即可。 */ #include <stdio.h> #include <stdlib.h> int main() { int i; int xSize; int ySize; int zSize; char ***array; /* 設定陣列型態 */ /* 設定陣列大小 */ xSize = 2; ySize = 3; zSize = 4; /* 配置三維陣列 */ array = calloc(xSize, sizeof(void *)); if (array == NULL) { fprintf(stderr, "記憶體不足。\n"); exit(1); } array[0] = calloc(xSize * ySize, sizeof(void *)); if (array[0] == NULL) { fprintf(stderr, "記憶體不足。\n"); free(array); exit(1); } array[0][0] = calloc(xSize * ySize * zSize, sizeof(***array)); if (array[0][0] == NULL) { fprintf(stderr, "記憶體不足。\n"); free(array[0]); free(array); exit(1); } for (i = 1; i < xSize; ++i) { array[i] = array[0] + ySize * i; } for (i = 1; i < xSize * ySize; ++i) { array[0][i] = array[0][0] + zSize * i; } /* 使用三維陣列 */ array[1][2][3] = 0; printf("%d\n", array[1][2][3]); /* 釋放三維陣列 */ free(array[0][0]); free(array[0]); free(array); return 0; }