亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

聲明C函數以返回數組

聲明C函數以返回數組

C
catspeake 2019-07-25 14:14:27
聲明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);}
查看完整描述

3 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

有幾件事要指出。

首先,不能像在這里那樣分配數組對象:

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 arraychar (*foo(int width))[HEIGHT]               -- of char

對于C89,上述代碼段中的高度必須是編譯時常量積分表達式(宏、數字文字或由宏和/或數字文本組成的算術表達式)。我不確定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]).



 


查看完整回答
反對 回復 2019-07-26
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

您永遠不能返回已分配的堆棧(“auto“)非原始(值)類型的變量,以及struct是這樣的。對于其他類型,您需要從堆中分配內存,使用malloc(),或將(固定大小)數組包裝為struct.

如果使用的是固定大小的數組,則可以將其建模為struct并使用struct-back:

#define WIDTH  11#define HEIGHT 11typedef struct {
  unsigned char cell[WIDTH * HEIGHT];} Board;Board board_new(void){
  Board b;
  size_t i;

  for(i = 0; i < sizeof b.cell / sizeof *b.cell; i++)
    b.cell[i] = rand() & 255;
  return b;}

這很好,而且不應該比使用顯式指針的代價更高:

void board_init(Board *b);

因為前者的struct-back可以重寫(由編譯器)到后者。這叫做返回值優化.




查看完整回答
反對 回復 2019-07-26
  • 3 回答
  • 0 關注
  • 374 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號