2

文字列を返す関数が必要でした。次のコードを使用して関数を宣言しました。

const char* serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return recv_data;
}

次に、メインの関数を次のように呼び出します。

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.
    app_data = serv_con(ser_data); //function call
}

コンパイルすると、次のエラーが表示されます。

connect.c:109: error: incompatible types when assigning to type ‘char[50]’ from type ‘const char *’

次に、宣言のconst charを std::string に置き換えました。現在の宣言は次のとおりです。

std::string serv_con(char app_data[50])
{
    char send_data[1024],recv_data[1024];
    //avoiding code segments irrelevant to the issue.
    return recv_data;
}

そして、上記と同じ方法でそれを呼び出しました。しかし、それでもコンパイル時に次のエラーが発生します。

connect.c:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token

関数からの戻り値の型として文字列を指定する方法を教えてください。私が取り組んでいるプラットフォームは Linux です。前もって感謝します。

4

4 に答える 4

9
const char* serv_con(char app_data[50])
{
  char send_data[1024],recv_data[1024];
  //i am avoiding code segments irrelevant to the issue.
  return recv_data;
}

ローカル変数へのポインターを返しているため、これは機能しません。これは、戻った後は無効です。recv_data戻った後に使用するには、ヒープに割り当てる必要があります

char* serv_con(char app_data[50])
{
  char send_data[1024];
  char *recv_data = malloc(1024);
  if (!recv_data)
      return NULL;

  // ...
  return recv_data;
 }

次に、メイン関数を次のように変更します

int main()
{
 char ser_data[50];
 char *app_data;
 ser_data[0] = '\0';
 //avoiding code segments irrelevant to the issue.
 app_data = serv_con(ser_data); //function call
 if (!app_data) {
   // error
 }
}
于 2012-05-16T09:29:06.677 に答える
3

あなたがしていることは本当に悪い考えです。このserv_con関数は、配列用にスタックにスペースを割り当て、recv_dataその場所へのポインターを返します。もちろん、別の関数を呼び出すとすぐにデータが消去され、診断が困難なバグにつながります。関数からメモリ ブロックを返す必要がある場合は、 を使用して割り当てますmalloc。基本的に、スタック上のオブジェクトへのポインターは返さないでください。

ポインターを取得したら、serv_con既にapp_dataスペースが割り当てられている に割り当てます。これを行う理由はありません。で割り当てられたストレージを指すapp_dataとして宣言するだけです。char *serv_con

于 2012-05-16T09:27:53.940 に答える
1

ローカル配列または配列自体へのポインターを返すことは悪い考えです。

関数内で malloc を実行したとしても、呼び出し元はそのメモリも解放する必要がありますが、これもあまり良い方法ではありません。

最良の方法は、出力パラメーターを渡すことです。つまり、結果をコピーする配列をパラメーターとして渡します。

int serv_con(char app_data[50], char recv_data[50])
{
    char send_data[1024];
     //recv_data[1024];
    //i am avoiding code segments irrelevant to the issue.
    return 1; // return status success or failure which can be tested in main
}

次に、メインの関数を次のように呼び出します。

int main()
{
    char ser_data[50], app_data[50];
    ser_data[0] = '\0';
    app_data[0] = '\0';
    //avoiding code segments irrelevant to the issue.

    serv_con(ser_data, app_data); //function call
}

ちょっとした間違いを見つけて修正しました。main に渡す app_data のサイズは 50 ですが、関数 serv_con から返そうとしたサイズは 1024 でした。これは一貫している必要があります。上記のコードでは、サイズ 50 の両方を使用しました。

于 2012-05-16T09:47:02.267 に答える
0

あなたの質問から、あなたが初心者だと確信できます。The C Programming Languageなどの優れた教科書を読んでください。

エラーとともに、これを取得する必要があります。
警告: 関数はローカル変数のアドレスを返します。

常に警告を見てください。質問はすでにGregによって回答されています。

于 2012-05-16T09:54:05.553 に答える