无论是一维还是二维,您都不能将数组作为函数的结果返回。您可以返回指向数组第一个元素的指针。此外,严格来说,C 中没有二维数组。与此最接近的是包含另一个数组作为元素的数组。 IE。像这样的定义:
int twoDimArray[2][3];
如果此类数组的维度是动态确定的,则不能在文件范围内定义它。您只能使用某些功能在本地定义它。这样的数组将是一个局部变量,将存储在系统堆栈中,并在控制离开函数时消失。就个人而言,我会使用这样的模式。 IE。像这样的代码:
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);
}