最近、クラスメートからの質問をいくつか見たのですが、その中には次のようなものがありました。関数で配列を返すにはどうすればよいですか?
カスタム関数に char * 型の戻り値を直接記述して、それを直接返すことはできますか?
## str 配列名を直接返します ( & を付ける必要はありませんが、多くの学生がこの間違いを犯します)しかし実際には、実行結果は正常ではありません。呼び出し側の関数で出力してみると、次のことがわかります。結果は元の内容ではありません (もちろん、コンピュータの出力です。まだこのようにはなっていないかもしれません)
は次のとおりです。
#理由は、str のプロパティから始めることができるためです。str 自体はカスタム関数の
ローカル変数です。 100 バイトの配列です。そのライフ サイクルは、もちろん、配置場所によって異なります。関数とともに、「皇帝と廷臣には一芸」という諺があるように、楽しい関数呼び出しが終了すると、その中のさまざまなローカル変数もシステムによって復元されます。もちろん、str 配列の 100 バイトも復元されるため、文字列「Hello www.dotcpp.com」は消去されました。当然ですが、main関数で出力したものは絶対にオリジナルの内容ではありません。 どうですか、わかります!
しかし、まだ終わったわけではなく、「なぜ次の書き方に変更できるのですか?」と質問し続ける学生もいます。
#以下に示すように:
##答え: この場合、str もローカル変数です。配列ではなくポインタで、わずか 4 バイトです。文字列「Hello www.dotcpp.com」を定数領域に格納しますが、この文字列は定数領域にあり、fun 関数に属する部分ではないことに注意してください。はプログラム全体で読み取り可能なため、return 後も存在します。返されるのは、文字列 "Hello www.dotcpp.com" の最初のアドレスである str の値です。これは数値であり、実際には以下と同等ですこの文字列のアドレスを戻り値を通じて str から p に転送します。
たとえを使うこともできます。以前は fun 関数だけがこの文字列を知っていましたが、今ではそれが死にかけています。死ぬ前に、彼は告白しました。「私はもうすぐ死にます。急いで「Hello www .dotcpp.com のトレジャー アドレス (文字列の最初のアドレス) が main 関数に転送されます!」と入力してください。
その後、すぐに main 関数に戻ります。 !その後消えます...
そして main 関数を取得するとわかります...
これで理解できますか?方法?
後半のC言語逆解析の部分でもここの原理が絡んでくるので、より深く学んで理解することができます。
同時に、次の記事ではカスタム関数の配列受け渡しの実装方法について説明します。
前回の説明で、配列を直接返す場合の問題点や理由は理解できたと思いますので、今回は関数で配列を返す一般的な方法について詳しく解説していきます。
#この種の問題では、関数内で処理された結果データを渡す必要があるなど、関数間の相互通信の問題を解決するアプリケーション シナリオがよくあります。
1. グローバル変数を直接使用する: この方法が最も便利ですが、この方法では、関数間の通信とカプセル化が重要であると考えられるため、その使用は推奨されず、今日の議論の範囲を超えています。
2. ヒープ領域での動的メモリ割り当てによる解決策: C 言語では、通常、malloc を使用してヒープ領域に動的にメモリを割り当てます。使用後は手動で「引き取り」機能を搭載し、柔軟な管理を実現します。実際の開発ではよく使われる手法であり、現在のメインコンテンツでもあります。
3. 呼び出し元は配列ポインターを渡します: このメソッドは関数の戻りアドレスを必要としませんが、呼び出し時に配列アドレスを直接渡し、呼び出し先に操作の実行を委ねます。 . このローカル変数は呼び出し元自身に属しているため、呼び出し先がメモリ解放を完了しても配列には影響しません。
一つずつ実験してみましょう 2 番目の方法では、ヒープ領域に動的にメモリが割り当てられるため、ヒープ領域はローカル変数をスタック領域に格納したくないのです。前回の講義で説明したとおりです。システムはライフサイクルに基づいて行われます。自動的に回復しますが、手動で開発および手動でリリースすることで、問題を完全に回避できます。以下の例と効果を参照してください:
注意してください: メモリを防ぐために、使用後は忘れずに解放してください。
#3 番目の方法: 関数で配列は返されませんが、配列通信の問題も解決できます。主なアイデアは次のように定義することです。呼び出し元の配列を呼び出し、アドレスを渡します。メモリは呼び出し先ではなく呼び出し元に属するため、呼び出しの完了後に呼び出し先がメモリを解放しても問題ありません。サンプルプログラムとその効果は以下のとおりです。
配列転送の使用方法の概要は上記のとおりです。ご質問やご不明な点がございましたら、お気軽にお問い合わせください。
読んでいただいた皆様、ありがとうございます。多くの利益が得られることを願っています。
推奨チュートリアル: 「C 言語」
以上がC言語でカスタム関数から配列を返す方法(画像と文章で詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。