我正在尝试制作一个包含长度可变的一维数组的数组。由于长度的变化,我无法使用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");
}
}
我的目标是能够摆脱那些ROW
和COL
变量,并且不具有固定的2D数组,而是具有可变长度的1D数组的数组。有人告诉我,使用指针是完成此任务的关键,但我自己也不知道该怎么做。
答案 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);