为了使数组在内存中持久存在,它要么需要被声明为
static
,要么应该使用
malloc
或
calloc
进行显式分配(每种解决方案都有功能上的影响——即
static
版本将在下一次调用函数时被覆盖,而分配的版本需要在后面明确释放以避免内存泄漏)。
请注意,在C语言中,指针和数组并不相同。由于在
malloc
情况下处理动态分配,因此您将使用指针。使用这些指针引用数组元素在功能上与引用数组元素相同,因此一旦创建了数组,您不应该注意到任何区别。
以下是一个示例,它使用单个
malloc
来分配、填充和返回2D数组(既为了效率,也为了允许使用单个
free
进行释放):
int **get2dArray(int rows, int cols)
{
int **array2d;
int i, j, offset;
int *gridstart;
offset = rows * sizeof(int *);
array2d = malloc( offset + rows*cols*sizeof(int) );
gridstart = (int *)((char *)array2d + offset);
for ( i = 0; i < rows; i++ ) {
array2d[i] = gridstart + i*cols;
for ( j = 0; j < cols; j++ ) {
array2d[i][j] = i*cols + j;
}
}
return array2d;
}
int main ( int argc, char **argv )
{
int **testarray;
testarray = get2dArray( 10, 100 );
printf( "%d %d %d %d %d %d\n", testarray[0][0], testarray[2][55],
testarray[4][98], testarray[5][0], testarray[7][15],
testarray[9][99] );
free(testarray);
return 0;
}
有许多其他方法可以实现这一点,但这演示了一个将返回2D指针“数组”的函数。
malloc
分配该数组。 - Roland Illig