C言語でカスタム関数から配列を返す方法(画像と文章で詳しく解説)
最近、クラスメートからの質問をいくつか見たのですが、その中には次のようなものがありました。関数で配列を返すにはどうすればよいですか?
カスタム関数に char * 型の戻り値を直接記述して、それを直接返すことはできますか?
しかし実際には、実行結果は正常ではありません。呼び出し側の関数で出力してみると、次のことがわかります。結果は元の内容ではありません (もちろん、コンピュータの出力です。まだこのようにはなっていないかもしれません)
は次のとおりです。
#理由は、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 番目の方法では、ヒープ領域に動的にメモリが割り当てられるため、ヒープ領域はローカル変数をスタック領域に格納したくないのです。前回の講義で説明したとおりです。システムはライフサイクルに基づいて行われます。自動的に回復しますが、手動で開発および手動でリリースすることで、問題を完全に回避できます。以下の例と効果を参照してください:
注意してください: メモリを防ぐために、使用後は忘れずに解放してください。
読んでいただいた皆様、ありがとうございます。多くの利益が得られることを願っています。
推奨チュートリアル: 「C 言語」
以上がC言語でカスタム関数から配列を返す方法(画像と文章で詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。
