困惑于双维数组等效

时间:2012-04-30 13:43:41

标签: c arrays

我的行大小是固定的但是列大小一直在变化。这就是为什么我想使用指针进行列级别。但我不知道如何在C中使用此功能。请帮助我。

int array[rows][columns]; //row size fixed but column size is not fixed.

6 个答案:

答案 0 :(得分:0)

您需要声明一个指针数组。像这样:

int *array[rows]; 

稍后,根据需要,为每一行分配内存。您可以使用malloc或calloc函数。

for(int i=0; i<rows; i++){
    array[i] = (int *) malloc(columns * sizeof(int));
}

此方法还允许具有不同大小的行。

答案 1 :(得分:0)

如果数组的所有维度都已修复,这是您描述的情况,则可以避免使用指针数组:您可以键入一行作为int[rows],并创建一个行数组,如这样:

typedef int row_t[rows];

现在你可以传递由row_t数组组成的2D数组,如下所示:

int total(row_t array[], int len) {
    int res = 0;
    for (int c = 0 ; c != len ; c++) {
        for (int r = 0 ; r != rows ; r++) {
            res += array[r][c];
        }
    }
    return res;
}

int main() {
    row_t *matrix = malloc(columns*sizeof(row_t));
    for (int c = 0 ; c != columns ; c++) {
        for (int r = 0 ; r != rows ; r++) {
            matrix[r][c] = r*r+c*c;
        }
    }
    printf("%d\n", total(matrix, columns));
    free(matrix);
    return 0;
}

答案 2 :(得分:0)

你不能在数组维度中使用变量,所以使用指向指针的指针

int **array;

array = (int **)malloc(sizeof(int *) * rows);
for (int i = 0; i < rows; ++i) {
    array[i] = (int *)malloc(sizeof(int) * columns); 
    for (int j = 0; j < columns; j++) {
       array[i][j] = value;
    }
}

并且当然不要忘记释放所有

答案 3 :(得分:0)

你可以通过使用int *数组来实现这一点,例如

int* array[row];
for (int i = 0; i < row; ++i)
    array[i] = (int*)malloc(i * sizeof(int));

然后您可以像访问静态数据一样访问数据。

int val = array[myRow][myColumn];

您必须确保以与分配相同的模式释放内存。

答案 4 :(得分:0)

自13年以来,C现在允许在数组声明中使用动态大小。这称为可变长度数组,VLA。

如果你真的有大型数组,这可能会影响您的堆栈。但是你仍然可以用malloc分配这样一个野兽,并拥有2D数组的所有简单性:

size_t n = SOME_COMPLICATED_VALUE;
size_t m = ANOTHER_ONE;
double (*A)[n] = malloc(double[m][n]);

答案 5 :(得分:0)

如果每一行可以有不同数量的列,那么通常的方法是声明一个指针数组,然后为每一行动态分配该行的元素数量:

int *array[ROWS];

array[i] = malloc(sizeof *array[i] * number_of_columns_for_row_i);

请注意,完成后,您必须单独释放每一行:

for (i = 0; i < ROWS; i++)
  free(array[i]);

如果所有行都具有相同列数,但该数字可以针对每个数组实例进行更改,那么您有多个选择。如果您使用的是符合C99的编译器,则可以使用可变长度数组,其中直到运行时才知道数组维度:

int columns;

// get number of columns somehow

int array[ROWS][columns];

VLA很方便,但有其局限性;它们不能是structunion类型的成员,也不能声明static或文件范围。这种方法的最大优点是,您不必担心在完成后取消分配任何内容。这种方法的主要缺点是你可能没有足够的内存来满足请求;与动态分配对象的内存相比,auto变量可用的内存空间通常非常有限。此外,最新版本的语言标准(C11)使VLA成为可选项,因此它们可能无法在所有实现中提供。

或者,您可以像这样动态分配数组:

int (*array)[ROWS];
int columns;

// get number of columns somehow

array = malloc(sizeof *array * columns);

请注意,这次,array是指向int 数组的指针,而不是指向int的数组。这种方法的好处是数组内存是连续分配的,free - 内存就像写

一样简单
free(array);

缺点是,如果您的阵列非常大或动态内存池真正碎片,您可能没有足够大的内存可用来满足请求。

如果你需要连续分配所有行,那么使用第一种方法分别分配每一行;只需对列数使用相同的值:

int *array[ROWS];
int columns;

// get number of columns

for (i = 0; i < ROWS; i++)
  array[i] = malloc(sizeof *array[i] * columns);