在我的C代码中,我的main函数中有一个动态分配的二维数组。我需要将这个二维数组传递给一个函数。由于数组的列和行都是运行时变量,我知道传递它的一种方法是:
-Pass行和列变量以及指向该数组元素的指针
myfunc(&arr[0][0],rows,cols)然后在被调用的函数中,将其作为“展平的”一维数组进行访问,如下所示:
ptr[i*cols+j]但我不想这样做,因为这将意味着代码中的许多更改,因为早些时候,传递给此函数的二维数组是静态分配的,其维数在编译时已知。
那么,如何才能将一个二维数组传递给一个函数,并且仍然能够将其用作具有2个索引的二维数组,如下所示?
arr[i][j].任何帮助都将不胜感激。
发布于 2010-08-09 20:28:29
请参阅下面的代码。在将2d数组基址位置作为双指针传递给myfunc()之后,您可以使用s[i][j]按索引访问数组中的任何特定元素。
#include <stdio.h>
#include <stdlib.h>
void myfunc(int ** s, int row, int col)
{
for(int i=0; i<row; i++) {
for(int j=0; j<col; j++)
printf("%d ", s[i][j]);
printf("\n");
}
}
int main(void)
{
int row=10, col=10;
int ** c = (int**)malloc(sizeof(int*)*row);
for(int i=0; i<row; i++)
*(c+i) = (int*)malloc(sizeof(int)*col);
for(int i=0; i<row; i++)
for(int j=0; j<col; j++)
c[i][j]=i*j;
myfunc(c,row,col);
for (i=0; i<row; i++) {
free(c[i]);
}
free(c);
return 0;
}发布于 2010-08-06 10:03:33
如果您的编译器支持C99可变长度数组(例如,GCC)然后你可以像这样声明一个函数:
int foo(int cols, int rows, int a[][cols])
{
/* ... */
}您还可以在调用代码中使用指向VLA类型的指针:
int (*a)[cols] = calloc(rows, sizeof *a);
/* ... */
foo(cols, rows, a);发布于 2010-08-05 21:01:54
你真的不能在不改变大量代码的情况下做到这一点。我建议将其封装在一个包含限制的结构中,然后使用regexp search‘n’‘n’replace来修复访问。
可以使用像AA(arr,i,j)这样的宏(就像在数组访问中一样),其中arr是结构。
https://stackoverflow.com/questions/3414827
复制相似问题