1

C で配列を返す方法を理解しようとしています。これがコードです。私がやろうとしているのは、配列を保存してから、関数 return を使用して出力することです。ここで何が間違っていますか?

#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;
}
4

3 に答える 3

1

ここではfunc、ローカル変数へのポインターを返しています。

return &output;

関数を離れると存在しなくなり、Jonathan が指摘したように、実際には の配列charへのポインタを返していますreturn output

動的割り当てを使用できない場合は、出力を引数として渡す必要があります。

于 2013-05-24T15:52:13.947 に答える
1

1 つの問題は、他の回答で既に述べられています。

  • 関数からローカル (非静的) 変数のアドレスを返すことは安全ではありません。

他の問題は次のとおりです。

char output[DIM];

次のタイプ:

return &output;

は「の配列へのポインタchar」であり、ではありませんchar *。あなたが書いた場合:

return output;

戻り値の期間を整理すれば、問題ありません。同様に、関数を配列へのポインターを返すように定義した場合は、問題ありません。

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

このように static 変数を使用すると、配列が実際に定数でない限り (スレッド化されたアプリケーションで使用するのは安全ではありません)、関数が再入不可になることに注意してください (この場合、定義は定数であると言う必要があります)。

于 2013-05-24T15:56:19.110 に答える