gpt4 book ai didi

c - 声明一个 C 函数以返回一个数组

转载 作者:太空狗 更新时间:2023-10-29 16:19:18 33 4
gpt4 key购买 nike

如何创建返回数组的函数?我试过了

const int WIDTH=11;
const int HEIGHT=11;

int main() {
char A[WIDTH][HEIGHT];
A=rand_grid(WIDTH,HEIGHT);
return 0;
}

// Initializes a random board.
char[][] rand_grid(int i, int k) {
char* A[i][k];
for(j=0;j<i;++j) {
for(l=0;l<k;++l) {
A[j][l]=ran(10);
}
}
return A;
}

// Returns a random number from the set {0,...,9}.
int ran(int i) {
srand((unsigned int) time(0));
return(rand()%10);
}

最佳答案

有几点需要指出。

首先,你不能像这里那样分配一个数组对象:

char A[WIDTH][HEIGHT];  
A=rand_grid(WIDTH,HEIGHT);

数组类型的对象是不可修改的。

其次,C 中的函数不能返回数组类型。不过,它们可以返回数组的指针:

char (*foo(int width))[HEIGHT]
{
/**
* dynamically allocate memory for a widthxHEIGHT array of char
*/
char (*newArr)[HEIGHT] = malloc(sizeof *newArr * width);
/**
* initialize array contents here
*/
return newArr;
}

语法有点困惑;它读作

       foo                                   -- foo
foo(int width) -- is a function
-- taking an int parameter
*foo(int width) -- returning a pointer
(*foo(int width))[HEIGHT] -- to a HEIGHT-element array
char (*foo(int width))[HEIGHT] -- of char

对于 C89,上述代码段中的 HEIGHT 必须是编译时常量整数表达式(宏、数字文字或由宏和/或数字文字组成的算术表达式)。我不确定 C99 是否也是如此。

根据您发布的代码片段,您要做的是获取一个您已经分配的数组并初始化其内容。请记住,在大多数情况下,数组类型的表达式将隐式转换为指向基类型的指针。 IOW,如果将 T 的 N 元素数组传递给函数,函数实际接收的是指向 T 的指针:

void foo (T *p) {...}
...
T arr[N];
foo(arr);

对于二维数组,它有点丑陋:

void foo (T (*p)[M]) {...}
...
T arr[N][M];
foo(arr);

这还依赖于 M 在编译时已知,这限制了函数的实用性。您想要的是一个可以处理任意大小的二维数组的函数。我知道实现此目的的最佳方法不是传递指向数组的指针,而是传递数组中第一个元素的地址 [1],并将行数和列数作为单独的参数传递:

void foo(T *base, size_t rows, size_t cols) {...}
...
T arr[N][M];
foo (&arr[0][0], N, M);

所以你的 rand_grid 函数看起来像这样:

void rand_grid(char *base, size_t rows, size_t cols)
{
size_t i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
/**
* Since base is a simple char *, we must index it
* as though it points to a 1-d array. This works if
* base points to the first element of a 2-d array,
* since multi-dimensional arrays are contiguous.
*/
base[i*cols+j] = initial_value();
}
}
}

int main(void)
{
char A[WIDTH][HEIGHT];
rand_grid(&A[0][0], WIDTH, HEIGHT);
...
}

  1. 即使表达式 &A[0][0]A 产生相同的值(A 的基地址),但两个表达式的类型不同.第一个表达式的计算结果为指向 char (char *) 的简单指针,而第二个表达式的计算结果为指向 char 的二维数组 (char (*)[HEIGHT])。

关于c - 声明一个 C 函数以返回一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1453410/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com