猿问

声明C函数以返回数组

声明C函数以返回数组

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

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);}


catspeake
浏览 357回答 3
3回答

喵喵时光机

有几件事要指出。首先,不能像在这里那样分配数组对象:char&nbsp;A[WIDTH][HEIGHT];&nbsp;&nbsp;A=rand_grid(WIDTH,HEIGHT);数组类型的对象是不可修改的。其次,C中的函数不能返回数组类型。他们可以回来指针但是,对于数组:char&nbsp;(*foo(int&nbsp;width))[HEIGHT]{ &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;dynamically&nbsp;allocate&nbsp;memory&nbsp;for&nbsp;a&nbsp;widthxHEIGHT&nbsp;array&nbsp;of&nbsp;char &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;char&nbsp;(*newArr)[HEIGHT]&nbsp;=&nbsp;malloc(sizeof&nbsp;*newArr&nbsp;*&nbsp;width); &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;initialize&nbsp;array&nbsp;contents&nbsp;here &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;return&nbsp;newArr;}语法有点混乱,它是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;foo &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo(int&nbsp;width)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;is&nbsp;a&nbsp;function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;taking&nbsp;an&nbsp;int&nbsp;parameter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*foo(int&nbsp;width)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;returning&nbsp;a&nbsp;pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*foo(int&nbsp;width))[HEIGHT]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;to&nbsp;a&nbsp;HEIGHT-element&nbsp;arraychar&nbsp;(*foo(int&nbsp;width))[HEIGHT]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;of&nbsp;char对于C89,上述代码段中的高度必须是编译时常量积分表达式(宏、数字文字或由宏和/或数字文本组成的算术表达式)。我不确定C99是否也是这样。根据您发布的代码片段,您要做的是获取已经分配的数组并初始化其内容。请记住,在大多数上下文中,数组类型的表达式将隐式转换为指向基类型的指针。IOW,如果将T的N元素数组传递给函数,则函数实际接收的是指向T的指针:void&nbsp;foo&nbsp;(T&nbsp;*p)&nbsp;{...}...T&nbsp;arr[N];foo(arr);对于二维数组,它有点丑:void&nbsp;foo&nbsp;(T&nbsp;(*p)[M])&nbsp;{...}...T&nbsp;arr[N][M];foo(arr);这还依赖于编译时已知的M,这限制了函数的有用性。您想要的是一个可以处理任意大小的二维数组的函数。我所知道的实现这一目标的最佳方法是将指针传递到数组,传递数组中第一个元素的地址[1],并将行数和列数作为单独的参数传递:void&nbsp;foo(T&nbsp;*base,&nbsp;size_t&nbsp;rows,&nbsp;size_t&nbsp;cols)&nbsp;{...}...T&nbsp;arr[N][M];foo&nbsp;(&arr[0][0],&nbsp;N,&nbsp;M);所以Rand_Grid函数看起来如下所示:void&nbsp;rand_grid(char&nbsp;*base,&nbsp;size_t&nbsp;rows,&nbsp;size_t&nbsp;cols){ &nbsp;&nbsp;size_t&nbsp;i,&nbsp;j; &nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Since&nbsp;base&nbsp;is&nbsp;a&nbsp;simple&nbsp;char&nbsp;*,&nbsp;we&nbsp;must&nbsp;index&nbsp;it &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;as&nbsp;though&nbsp;it&nbsp;points&nbsp;to&nbsp;a&nbsp;1-d&nbsp;array.&nbsp;&nbsp;This&nbsp;works&nbsp;if &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;base&nbsp;points&nbsp;to&nbsp;the&nbsp;first&nbsp;element&nbsp;of&nbsp;a&nbsp;2-d&nbsp;array, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;since&nbsp;multi-dimensional&nbsp;arrays&nbsp;are&nbsp;contiguous.&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base[i*cols+j]&nbsp;=&nbsp;initial_value(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}int&nbsp;main(void){ &nbsp;&nbsp;char&nbsp;A[WIDTH][HEIGHT]; &nbsp;&nbsp;rand_grid(&A[0][0],&nbsp;WIDTH,&nbsp;HEIGHT); &nbsp;&nbsp;...}即使这些表情&A[0][0]和A产生相同的值(A的基址),这两个表达式的类型是不同的。第一个表达式计算为指向char的简单指针(char *),而第二个值计算为指向char的二维数组的指针(char (*)[HEIGHT]).&nbsp;

守着星空守着你

您永远不能返回已分配的堆栈(“auto“)非原始(值)类型的变量,以及struct是这样的。对于其他类型,您需要从堆中分配内存,使用malloc(),或将(固定大小)数组包装为struct.如果使用的是固定大小的数组,则可以将其建模为struct并使用struct-back:#define&nbsp;WIDTH&nbsp;&nbsp;11#define&nbsp;HEIGHT&nbsp;11typedef&nbsp;struct&nbsp;{ &nbsp;&nbsp;unsigned&nbsp;char&nbsp;cell[WIDTH&nbsp;*&nbsp;HEIGHT];}&nbsp;Board;Board&nbsp;board_new(void){ &nbsp;&nbsp;Board&nbsp;b; &nbsp;&nbsp;size_t&nbsp;i; &nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;sizeof&nbsp;b.cell&nbsp;/&nbsp;sizeof&nbsp;*b.cell;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;b.cell[i]&nbsp;=&nbsp;rand()&nbsp;&&nbsp;255; &nbsp;&nbsp;return&nbsp;b;}这很好,而且不应该比使用显式指针的代价更高:void&nbsp;board_init(Board&nbsp;*b);因为前者的struct-back可以重写(由编译器)到后者。这叫做返回值优化.
随时随地看视频慕课网APP
我要回答