簡體   English   中英

從C函數返回數組

[英]Returning an array from a C function

我試圖弄清楚如何在C中返回數組。這是代碼。 我想做的是保存一個數組,然后使用函數返回將其打印出來。 我在這里做錯了什么?

#include <stdio.h>
#define DIM 50


char *func (char input[]);

int main(void)
{
   char input[DIM];

   printf("input? ");
   fgets(input, DIM, stdin);

   printf("output: %s", func(input));

   return 0;
}

char *func(char input[])
{
   int i;
   char output[DIM];

   for(i = 0; i < DIM; i++)
   output[i] = input[i];
   return &output;
}

func您將在此處返回指向局部變量的指針:

return &output;

離開函數后該函數將不存在,正如喬納森指出的那樣,您實際上正在返回一個指向char數組的指針,如果您想返回該指針,則只需完成return output但這仍然是錯誤的。

如果不能使用動態分配,則需要將輸出作為參數傳遞。

其他答案已經說明了一個問題:

  • 從函數返回局部(非靜態)變量的地址是不安全的。

另一個問題是給定的:

char output[DIM];

類型:

return &output;

是“指向char數組的指針”,而不是char * 如果您寫了:

return output;

您就可以了-如果您整理出返回值的持續時間。 同樣,如果您將函數定義為返回指向數組的指針,則可以:

char (*func(char input[]))[]
{
    static char output[DIM];
    ...
    return &output;
}

請注意,除非這樣的靜態變量會使得該函數不可重入(在線程應用程序中使用是不安全的),否則除非該數組實際上是常量(在這種情況下,定義應該說它是常量),否則該變量將使函數不可重入。

可以返回地址,但不能那樣返回。

嘗試這個

char *func(char input[])
{
int i;
char *output = (char*)malloc(sizeof(char) * DIM);

for(i = 0; i < DIM; i++)
    output[i] = input[i];



    return output;
}

另一種方法是像“通過引用調用”那樣進行。 看起來像這樣

void func(char *input, char *output)
{
int i;

for(i = 0; i < DIM; i++)
    output[i] = input[i];

}

而且您的主體應該看起來像這樣

int main()
{
char *input = (char*)malloc(sizeof(char) * DIM);
char *output = (char*)malloc(sizeof(char) * DIM);

printf("input? ");
fgets(input, DIM, stdin);
func(input, output);

printf("output: %s", output);
free(input);
free(output); // after you finished your work with this variable

return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM