通过任意大小的2维数组

嗨,我正在研究排序算法,因为我想制作一个简单的程序,从文本文件中获取整数数组。 在这样做的时候,我遇到了一些麻烦和关于数组和函数的问题,并将它们作为参数。 这是我做的:

#include #include #define MAX_SIZE 64 #define MAX_INT_SIZE 10000 void itobuff(const char* istring,const int** sint); int getistring(FILE* file,char strbuffer[][MAX_SIZE],int max_int,int max); int main(int argc,char*argv[]){ char buffer[MAX_INT_SIZE][MAX_SIZE]; int int_counter=0; int int_buffer[MAX_INT_SIZE]; FILE *file = fopen("MYFILE.txt","r"); getistring(file,buffer,MAX_INT_SIZE,MAX_SIZE); return 0; } 

我的疑问是关于function的定义

 int getistring(FILE* file,char strbuffer[][MAX_SIZE],int max_int,int max); 

我想写一个允许使用任何大小数组的函数。 我知道这是错的,但从逻辑上讲,这是我想要实现的,但无法弄清楚如何。

  int getistring(FILE* file,char strbuffer[][],int max_int,int max); 

我知道我想做的事情可能会以其他方式完成,但我想知道如何去做。 例如,如果我想编写一个获取数组并返回该数组的行列式的函数,则不应强制将自己限制为ak size数组。 或者更一般地,对于任何其他arrays操作的i-columns,j-rowsarrays。

如果您使用的是支持C 1999的C实现,那么它支持可变长度数组。

声明一个采用可变长度数组参数的函数,如下所示:

 int getistring(FILE *file, size_t Rows, size_t Columns, char buffer[][Columns]); 

像这样调用函数:

 result = getistring(file, Rows, Columns, buffer); 

像这样创建缓冲区数组:

 size_t Rows = some calculation for number of rows; size_t Columns = some calculation for number of columns; char (*buffer)[Columns] = malloc(Rows * sizeof *buffer); if (!buffer) Handle error. 

完成后,释放缓冲区数组,如下所示:

 free(buffer); 

如果行数和列数很小,则可以使用自动存储定义缓冲区数组,而不是使用mallocfree ,如下所示:

 char buffer[Rows][Columns]; 

二维arrays实际上是在一个维度上布局的。 您需要提供步长的原因是编译器知道如何将索引相乘以生成线性索引。 如果要使用任意大小的数组,请使用1-D数组并提供步长。

考虑一下:

 char strbuffer[][MAX_SIZE]; 

编译器知道要在strbuffer[i][j]获取一个元素,它必须使用:

 strbuffer + i * MAX_SIZE + j; 

请注意,我使用了strbuffer ,就像它是一个指针一样。 您可以这样做 – 编译器会将数组转换为指针,以方便使用。

因此,重新定义您的函数以获取一维数组,并使用上面的计算。 如果您尚未传递步长(或宽度,或任何您称之为),请将其添加为参数:

 int getistring(FILE* file, char strbuffer[], int max_int, int max);