将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 ,对它们来说通常没有意义。