通过任意大小的2维数组

时间:2013-07-11 01:49:22

标签: c arrays pointers

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

#include<stdio.h>
#include<stdlib.h>

#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;

} 

我怀疑函数的定义

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

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

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

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

2 个答案:

答案 0 :(得分:3)

如果您使用的是支持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];

答案 1 :(得分:0)

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