将2D数组传递给C中的函数
基本上,我有一个数据矩阵(比如说int),我想存储在一个二维数组中,直到运行时才知道维度(比如x列和y行)。 我想在函数中填充数组,所以我假设我需要做这样的事情:
int main(int argc, char **argv) { int y = atoi(argv[1]); int x = atoi(argv[2]); int **matrix = malloc(x * sizeof(int*)); populateMatrix(matrix, y, x); return 0; } void populateMatrix(**matrix, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { matrix[i][j] = i * j; // populated with trivial data to keep it simple } } }
显然这不起作用,但我不确定如何做我正在描述的内容。
你缺少的是每个内部数组也需要malloc’ed。
int **matrix = malloc(x * sizeof(int *));
应该是这样的:
int **matrix = (int **)malloc(y * sizeof(int *)); for (i = 0; i < y; ++i) { matrix[i] = (int *)malloc(x * sizeof(int)); }
也就是说,我所知道的大多数矩阵库只会使用:
int *matrix = (int *)malloc(x * y * sizeof(int));
然后使用:
int n = matrix[y * cols + x];
阅读个别元素。 对于(非稀疏)矩阵,这比为每行分别分配块更有效。 它还保证数据在内存中是连续的,这可以使CPU缓存更有效。
你能不能只使用一维数组并按行或列存储? 然后你只需使用array[row * numcols + col]
而不是array[row][col]
来访问数组元素。
它在内部确实没有任何区别,因为内存不关心你是否使用两个维度或一个维度。
main中的矩阵是指向int的指针。 您的程序为x指针分配空间。 考虑到populateMatrix中的循环,这应该是指向int的y指针的空间。 更重要的是,您没有为行分配空间。 你需要在main中使用另一个循环,它将分配y行,每个行足够大以容纳x个int。
C99有一个简单的工具,经常不赞成,但提供你想要的,可变长度数组,VLA。
void populateMatrix(size_t y, size_t x, double matrix[x][y]);
他们不赞成的原因是,如果你直接使用它们在堆栈上分配矩阵,你可能会发现堆栈溢出。 你可以通过实际传递指向这些野兽的指针来避免这种情况:
void populateMatrix2(size_t y, size_t x, double (*matrix)[x][y]) { for (... something ...) { (*matrix)[i][j] = 33.0; } }
并在某些function:
double (*myMatrix)[n][m] = malloc(sizeof(*myMatrix)); populateMatrix2(n, m, myMatrix);
对于语法,您只需要将维度的大小放在参数列表中的矩阵之前,以便在该点处知道它们。 对于作为索引和对象大小的所有内容,也使用size_t
,对它们来说通常没有意义。