2016-01-13 49 views

回答

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); 

如果你有一个古老的编译器,你必须创建一个更难看, “错位”二维数组:

int* ptr = malloc(sizeof(int) * x * y); 

ptr[i*y + j] = something; // access one element 

free(ptr); 
+0

真的很酷的想法,使用像这样的可变长度数组。对于那些不知道的,“古代编译器”的意思是“C99之前的编译器”,比如MSVC。 – fuz

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; 
} 
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)使得码会更可读性,实际上这仅仅是处理更复杂的情况,然后是二维的情况。