我的行大小是固定的但是列大小一直在变化。这就是为什么我想使用指针进行列级别。但我不知道如何在C中使用此功能。请帮助我。
int array[rows][columns]; //row size fixed but column size is not fixed.
答案 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很方便,但有其局限性;它们不能是struct
或union
类型的成员,也不能声明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);