如何初始化具有非恒定长度的数组的数组?

时间:2018-06-20 21:49:55

标签: c arrays pointers

我正在尝试制作一个包含长度可变的一维数组的数组。由于长度的变化,我无法使用2D阵列。我的代码如下:

int ROW = 6;
int COL = 4;
int faceverts[6][4] = {{3,2,1,0}, {4,5,1,0}, {2,6,5,1}, {2,3,5,6}, {7,3,0,4}, {1,6,7,4}};   
int (*q)[4] = faceverts;

int main(){
    for (int i = 0; i < ROW; i++){
        for (int k = 0; k < COL; k++)
            printf("%d ", *(*(q+i)+k));
        printf("\n");
    }
}

我的目标是能够摆脱那些ROWCOL变量,并且不具有固定的2D数组,而是具有可变长度的1D数组的数组。有人告诉我,使用指针是完成此任务的关键,但我自己也不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

一种方法是创建结构数组。每个结构元素都包含一个指针并计数到一个数组。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int *a;
  size_t n;
} TwoD;

#define AN(a) (sizeof (a)/sizeof (a)[0])

int smallest[1] = { 1 };
int smaller[2] = { 2, 3 };
int small[3] = { 4, 5, 6 };
int big[4] = { 7, 8, 9, 10 };
int bigger[5] = { 11, 12, 13, 14, 15 };
int biggest[6] = { 16, 17, 18, 19, 20, 21 };

TwoD faceverts[6] = {
    { smallest, AN(smallest) }, { smaller, AN(smaller) }, { small, AN(small) }, 
    { big, AN(big) }, { bigger, AN(bigger) }, { biggest, AN(biggest) } };

int main(void) {
  // Let us change things a bit at run time
  int change[] = { 22,23,24,25,26,27,28 };
  faceverts[0] = (TwoD) {change, AN(change)};  // compound literal
  for (size_t row = 0; row < AN(faceverts); row++) {
    for (size_t col = 0; col < faceverts[row].n; col++) {
      printf(" %d", faceverts[row].a[col]);
    }
    printf("\n");
  }
  return 0;
}

输出

 22 23 24 25 26 27 28
 2 3
 4 5 6
 7 8 9 10
 11 12 13 14 15
 16 17 18 19 20 21

答案 1 :(得分:0)

内存中只有一维数组。 (2D数组实际上是一个长的1D数组)

分配2D数组(行,列)

int *arr;
int size;
size = width * height;
arr = (int *) malloc(sizeof(int) * size);

数组中的访问元素(x,y)

int e;
int offset;
offset = x * cols + y;
e = *(arr + offset);

释放数组

free(arr);

分配不规则的2D数组(col_0,col_2,....,col_n-1);

int arr;
int size = 0;
// size = col_0 + ... + col_n-1;
arr = (int *) malloc(sizeof(int) * size);

数组中的访问元素(x_row,y_col)

int e;
int offset;
// offset = col_1 + ... + col_x-1 + y_col;
e = *(arr + offset);