为二维整数数组分配内存,但它应该是连续的

时间:2016-01-13 09:48:54

标签: c arrays pointers multidimensional-array malloc

我想将内存分配给类型为int的二维数组,但内存应该是连续的。

只需拨打一次free( ptr )即可将其释放。我不需要随意给每个内存块打电话。

3 个答案:

答案 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),以便代码更具可读性,实际上这只需要处理更复杂的情况,然后是二维代码。