cのグローバル変数とヒープ変数の違いと類似点は何ですか?
このコードがあるとします。
const char* globalVar = "This is a string";
int main(int argc, char* argv[]){
char* heapVar = malloc(7 * sizeof(char));
}
では、globalVarとheapVarの違いと類似点は何ですか?
前もって感謝します。
cのグローバル変数とヒープ変数の違いと類似点は何ですか?
このコードがあるとします。
const char* globalVar = "This is a string";
int main(int argc, char* argv[]){
char* heapVar = malloc(7 * sizeof(char));
}
では、globalVarとheapVarの違いと類似点は何ですか?
前もって感謝します。
グローバル変数とヒープ変数は2つの異なる概念です。ヒープ変数は単に変数のスペースが割り当てられた場所を示し、グローバル変数は変数のスコープを示します。
グローバルとは、変数がすべてのユーザーに表示されることを意味し、ローカルとは対照的に、変数の表示が制限されることを意味します。
ヒープとは、変数(ポインター)が動的に割り当てられたことを意味し(例:mallocを使用)、変数が動的に割り当てられなかったスタックとは対照的です。
したがって、グローバルヒープ変数、グローバルスタック変数、ローカルヒープ変数、またはローカルスタック変数を使用できます。
あなたの場合、globalVarは関数のスコープ(中括弧)の外で宣言されているのでグローバルですが、heapVarはmainに対してローカルです。mallocが呼び出されたため、heapVarがヒープ上で宣言されます。globalVarは、char *宣言を使用しているため、特殊なケースです。
char *スタイル宣言の処理方法の詳細については、「 ヒープまたはスタック? 」を参照してください。C++の関数呼び出しで定数文字列が参照される場合
グローバル変数は常に存在し、消えることはありません。さらに、そのファイル/モジュール内のすべての関数に表示され、「静的」として宣言されていない限り、ファイル/モジュール全体にも表示されます。
グローバル変数は「これは文字列です」ではなく、単なるポインタ(メモリ内のアドレスを含む)であるglobalVariableのみであることに注意してください。
heapVar変数には、ヒープ上の何かへのアドレスが含まれています。その変数は、main()関数内でのみ表示されます。
ヒープを指すようにグローバル変数を作成できます。
ここでの違いは、globalVariableが指すコンテンツは静的に割り当てられ、heapVarが指すコンテンツは動的に割り当てられることです(free()を呼び出してメモリを解放することで破棄できますが、その文字列で使用されるメモリを解放することはできません。 string "、これはglobalVarが指すコンテンツです)。
注意:ここでは、globarVarとheapVarについて話しますが、それらが指しているメモリについては話しません。
違いは次のとおりです。
スコープ
heapVarはヒープではなくスタックにあるため、そのスコープはその関数に対してローカルであり、globarVarはどこでも評価できます。
生活
heapVarは関数呼び出しが終了すると停止し、globarVarはプログラムの全期間中存続します。
彼らが指している記憶について:
heapVarが指すメモリはヒープ内にあり、globarVarが指すメモリは実装定義の読み取り専用メモリ内にあるため、安全のためにconstchar*にします。
char* globalVar = "This is a string";
ヒープ内のメモリはいつでも解放でき、リテラル文字列はプログラムの全期間にわたって存続します。あなたの場合、あなたは漏れを抱えています。とにかく、これは単なる例であると私は理解しています、多分あなたはそれを知っています。