也许我的问题很容易,但我在C中是新手。
我创建了一个函数,它从文件中读取一些数据然后将它们传递给另一个函数,该函数在给定行数和列数的情况下解析它们并创建一个2D数组。
我想返回此数组,以便在其行中执行某些操作。如何在C
中返回2D数组有人能给我一个例子,或者我做错了什么?
此致
答案 0 :(得分:1)
注意,在C中返回数组是一个初学者的陷阱,因为它高度依赖于存储持续时间:
更惯用的方式是调用者传递它拥有的数组及其大小。
答案 1 :(得分:0)
无论函数是一维还是二维,都无法返回数组。您可以返回指向数组第一个元素的指针。另外,严格来说,C中没有二维数组。最接近它的是一个包含另一个数组作为元素的数组。即像:
这样的定义int twoDimArray[2][3];
如果动态确定此类数组的维度,则无法在文件范围内定义它。您可以使用某些功能在本地定义它。这样的数组将是一个局部变量,将存储在系统堆栈中,并在控制离开函数时消失。就个人而言,我会使用这种模式。即代码如:
int main() {
int rows, cols;
...
getDimensions(&rows, &cols);
// definition with dynamic dimensions in function scope is O.K.
int a[rows][cols];
init(rows, cols, a);
proceed(rows, cols, a);
...
}
其中init
函数可以定义为:
void init(int rows, int cols, int a[rows][cols]) {
int i,j;
for(i=0; i<rows; i++) {
for(j=0; j<cols; j++) {
a[i][j] = i*100+j;
}
}
}
如果无法使用这样的模式(例如,数组太大而系统堆栈太小),我会使用:
int main() {
int rows, cols;
getDimensions(&rows, &cols);
int (*a)[cols] = malloc(sizeof(int [rows][cols]));
init(rows, cols, a);
proceed(rows, cols, a);
free(a);
}
如果你坚持返回这样一个数组的函数,我会使用void指针:
void *allocate2DintArray(int rows, int cols) {
return(malloc(sizeof(int [rows][cols])));
}
void *allocateAndInit(int rows, int cols) {
int i,j;
int (*a)[cols] = allocate2DintArray(rows, cols);
for(i=0; i<rows; i++) {
for(j=0; j<cols; j++) {
a[i][j] = i*100+j;
}
}
return(&a[0][0]);
}
int main() {
int rows, cols;
...
getDimensions(&rows, &cols);
int (*a)[cols] = allocateAndInit(rows, cols);
proceed(rows, cols, a);
...
free(a);
}