[C言語でのストレージクラススコープライフサイクルリンクの重要な知識ポイント]

C言語ストレージクラススコープライフサイクルリンク

私はしばらくの間c言語を学び、メモリ内でさまざまな変数がどのように割り当てられるかを定義する方法、およびそれぞれのスコープとライフサイクルは何ですか?以下で共有してください。

一、存储类

一般に、メモリの管理方法は次のとおりです。
スタック、ヒープ、データセグメント、bssセグメント、テキストセグメント
例:関数のローカル変数はスタックに割り当てられるため、スタックに格納されます。表示の初期化は次のとおりです。 0以外のグローバル変数はデータセグメントに割り当てられ、表示は0に初期化されるか、初期化されたグローバル変数のbssセグメントに割り当てられます。これが、ローカル変数を定義するときに通常初期化する必要がある理由です。ランダム値、およびグローバル変数を定義する場合、それらは初期化されていない場合もあり、0の場合もあります(これはすべて、それらが割り当てられているメモリ範囲によって異なります)。詳細については、以下で説明します。

二、作用域(描述变量所起作用的范围)

ここに画像の説明を挿入
ここに画像の説明を挿入

上記の結果から、簡単な結論を導き出すことができます。変数が配置されているスコープは{}の間で機能し、グローバル変数が定義されている場合は、プログラムが終了するスコープです。上記の例で定義されたaは、forループ{}のスコープ内で機能するため、{}の後に印刷されたものが下にジャンプし、変数が定義されていない場合、エラーが報告されます。

三、生命周期

ライフサイクルは、変数がいつ生まれ、いつ終わるかを表すものです。変数のライフサイクルを研究することは、いくつかの驚異的な特性を理解するのに役立ちます。(スコープは変数のストレージクラスと密接に関連しています)

 四、链接属性

1.プログラムは、ソースプログラムから実行可能プログラムへのプロセスを実行します。コンパイル

リンクプロパティ
(ストレージクラスはリンクプロパティと密接に関連しています)

五、linux下c程序的内存映象

1.コードセグメント、読み取り専用データセグメント
1.コードセグメントはLinuxではテキストセグメント(.text)とも呼ばれます
2.読み取り専用データセグメントは、プログラムの実行中に読み取りのみが可能で、書き込みができないデータです。 const-変更された定数は、読み取りデータセグメントにのみ格納されます。
2.データセグメント、Bssセグメント
1.データセグメント:ゼロ以外に初期化されたグローバル変数とゼロ以外の静的変更に初期化されたローカル変数を表示します。
2. bssセグメント:ゼロで初期化されたグローバル変数と初期化されていないグローバル変数を表示します。3
。ヒーププログラマーは、自分のニーズに応じて、ヒープのスペースmalloc(アプリケーション)フリー(リリース)特性
を手動で申請します。適用して解放する2.使用するときは細部に注意を払う(使用後に時間内に解放する)3。繰り返し使用する(スペースを適用するときは、特徴的なメモリ領域に継続的に適用して解放する) 4.ローカルスタック変数はスタックに割り当てられ、関数呼び出しパラメーターもスタックスタックの特性を使用します1.システムはメモリスペースを自動的に割り当てて破棄します2.使用は柔軟ではなく、メモリスペースは次のように合理的に割り当てることができません。独自のニーズ3.ダーティメモリ(スタックのサイズも制限されているため、スタック上のメモリスペースが割り当てられると、常に同じスタックスペースで使用されます)4。繰り返し使用5.次のような問題に注意してくださいスタックオーバーフロー(定義変数が大きすぎて、再帰呼び出しが繰り返されます)5.カーネルマッピング領域1.オペレーティングシステムのカーネルプログラムをこの領域にマップします2. linuxのプロセスごとに、システム全体がそれ自体とカーネルのみ















3.各プロセスは独自の独立したスペースに存在し、0〜3Gスペースの各プロセスは異なりますが(カーネルでは仮想メモリアドレステクノロジが使用されているため)、カーネルは
Osおよびベアメタルの下で6つだけです。 .cプログラムの違い
1.このアシストコードはコードの読み込みと実行と呼ばれ、その機能はグローバル変数に値を割り当て、bssセグメントをクリアすることです(C言語で初期化されたグローバル変数が0である理由はthis)
2.グローバルデータセグメント変数と静的ローカル変数はどちらもゼロ以外の初期化です。これらの処理はmain関数の前に初期化され、再配置中に行われる初期化です。

六、存储类相关的关键字

1. autoキーワードの機能は1つだけです。これは、ローカル変数を変更するために使用されます
。1. autoキーワードは、ローカル変数を変更して、このローカル変数が自動ローカル変数であり、自動ローカル変数がスタックに割り当てられることを示します。したがって、値が初期化されていない場合はランダムになります
。2.通常、ローカル変数を定義する場合、autoタイプを定義しますが、autoキーワードは省略されます。autoのローカル変数は、定義された通常のローカル変数であることがわかります。デフォルト
では、staticキーワード
は一般的にc言語では静的です。2つの異なる使用法のみがあり
ます。1。最初の使用法:ローカル変数の変更に使用、形式パラメーター静的ローカル変数、静的および非静的ローカル変数主な違いつまり、ストレージクラスが異なり、静的ローカル変数はデータセグメントまたはbssセグメントに割り当てられますが、通常のローカル変数はスタックに割り当てられます。
2. 2番目の使用法:グローバル変数を変更して静的グローバル変数を形成するために使用されます。静的と非静的の違い(つまり、通常のグローバル変数の違いは主に)リンク属性が異なります(以下で説明します)特定のリンク属性とは何かの詳細)。
分析:
1)静的ローカル変数のストレージクラスはグローバル変数のストレージクラスと同じです
。2)静的ローカル変数のライフサイクルはグローバル変数のライフサイクルと同じです
。3)静的ローカル変数とグローバル変数の違いは:スコープとリンクのプロパティ。静的ローカル変数(通常のローカル変数と同じ)とリンク属性のスコープはリンクされています。グローバル変数のスコープはファイルスコープ(関数と同じ)、つまりプログラム全体です。
3. externキーワード
はグローバル変数を宣言し、externで宣言された変数は異なるcファイル間で使用できます。extern宣言が使用されていない場合、エラーが報告されます。

demo1.c

ここに画像の説明を挿入

demo2.c

ここに画像の説明を挿入
運転結果
ここに画像の説明を挿入

上記の結果から、main関数で使用したval変数は、別のファイルが定義されている場合はexternで宣言されていないため、ファイルが見つからずコンパイルできない場合はエラーが報告されます。
5. registerキーワードの機能registerキーワード
の機能は1つだけです。このキーワードで変更された変数は、レジスタに割り当てられます(効率が大幅に向上します)
。6。volatileキーワード
1. volatileキーワード:変数で変更が簡単キーワードによって変更された変数。コンパイラは、volatileによって変更された変数に遭遇したときに変数を最適化せず、エラー
2は発生しません。変数がvolatileによって変更された場合、プログラムの続行時に値は変更されません。そのため、必要な値も得られません。したがって、(ISRでの参照変数の中断、マルチスレッドでの共有変数、ハードウェアによって変更される変数)の場合、変数を変更するにはvolatileを使用する方が適切
です。7つ目は、restrictキーワード
はポインターの変更にのみ使用されます。通常の変数ではありません。

七、链接属性

リンク属性は、外部リンク、内部リンク、およびリンクなしの3つの方法に分類
できます。リンクは内部スコープ内で実行され、内部リンク3
に属するcファイル(静的変更関数、グローバル変数)の外部にリンクすることはできません。
リンクとは、このシンボルがリンクに参加せず、すべてのローカル変数(auto、static)がリンクに属していないことを意味します

以上就是C语言中存储类、作用域、生命周期和链接属性相关的知识点了。
熟练的掌握该知识点可以更好的帮助我们对变量的理解,分配方式,存储地方,作用范围,生命周期以及链接属性

おすすめ

転載: blog.csdn.net/boybs/article/details/122977704