您可以创建一个 1-D指针数组,而不是创建单个 1-D 数组并将其视为 2-D 数组,其中每个指针指向另一个 1-D 数组。这使您可以为数组中的每一行分配不同的大小。
例如:
// Allocate and initialize a triangular 2-D array
int** make_triangle_array(int nrows)
{
int ** arr;
// Allocate the 1-D array of pointers
arr = malloc(nrows * sizeof(int *));
// Allocate each row of the triangular array
for (int i = 0; i < nrows; i++)
{
int rowlen = i+1;
// Allocate a row of ints for the array
arr[i] = malloc(rowlen * sizeof(int));
// Fill the row with '1' values
for (int j = 0; j < rowlen; j++)
arr[i][j] = 1;
}
// Return the allocated array
return arr;
}
// Test driver
void test(int n)
{
int ** arr;
arr = make_triangle_array(n);
...
free_triangle_array(arr, n);
}
这种方法的优点是能够为每一行分配任何大小。它还具有能够使用语法arr[x][y]
访问数组中给定元素的优点。
(这与 Java 和 C# 等语言使用引用分配多维数组的方式非常相似。)
请注意,当您使用完数组后,您必须分两步释放它;首先你必须释放数组的每一行,然后你必须释放数组(指针)本身。
// Deallocate a 2-D array
void free_triangle_array(int **arr, int nrows)
{
// Free each allocated row
for (int i = 0; i < nrows; i++)
{
if (arr[i] != NULL)
free(arr[i]);
arr[i] = NULL;
}
// Free the pointer array
free(arr);
}