我想将内存分配给类型为int
的二维数组,但内存应该是连续的。
只需拨打一次free( ptr )
即可将其释放。我不需要随意给每个内存块打电话。
答案 0 :(得分:5)
正式地,它是这样完成的:
int (*arr_ptr) [x][y] = malloc( sizeof(int[x][y]) );
(*arr_ptr)[i][j] = something; // access one element
free(arr_ptr);
然而,这使元素的访问有点不方便:(*arr_ptr)[i][j]
有点难以阅读。避免这种情况的一个技巧是省略数组指针的一个维度,而是将其视为一维数组的数组:
int (*arr_ptr) [y] = malloc( sizeof(int[x][y]) );
arr_ptr[i][j] = something; // access one element
free(arr_ptr);
如果你有一个古老的编译器,你必须创建一个更丑陋,“受损”的2D数组:
int* ptr = malloc( sizeof(int) * x * y );
ptr[i*y + j] = something; // access one element
free(ptr);
答案 1 :(得分:2)
如果您的编译器支持可变长度数组(VLA),那么您可以按以下方式编写
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
size_t m = 3;
size_t n = 4;
int ( *a )[n] = malloc( m * n * sizeof( int ) );
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ ) a[i][j] = i * n + j;
}
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ ) printf( "%2d ", a[i][j] );
printf( "\n" );
}
free( a );
return 0;
}
程序输出
0 1 2 3
4 5 6 7
8 9 10 11
否则n
必须是常量。例如
#include <stdlib.h>
#include <stdio.h>
#define N 4
int main( void )
{
size_t m = 3;
int ( *a )[N] = malloc( m * N * sizeof( int ) );
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < N; j++ ) a[i][j] = i * N + j;
}
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < N; j++ ) printf( "%2d ", a[i][j] );
printf( "\n" );
}
free( a );
return 0;
}
答案 2 :(得分:0)
另一种可能性是使用一维数组作为二维数组,如下例所示:
#include <stdio.h>
#include <stdlib.h>
#define N 2
#define M 3
/*
array has N * M elemts:
| N | N | N |
v v v v
|----|----|----|----|----|----|
array[i][j] == array[i*N + j]
*/
#define GET(i,j) (i*N + j)
int main(int argc, char **argv) {
int *array;
int i, j;
array = malloc(N * M *sizeof(int));
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
array[i*N + j] = i+j;
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
printf("array[%d][%d] = %d\n", i, j, array[i*N + j]);
printf("Using the macro:\n");
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
printf("array[%d][%d] = %d\n", i, j, array[GET(i,j)]);
free(array);
return 0;
}
我还定义了一个宏GET(i,j)
,以便代码更具可读性,实际上这只需要处理更复杂的情况,然后是二维代码。