3

cのグローバル変数とヒープ変数の違いと類似点は何ですか?

このコードがあるとします。

const char* globalVar = "This is a string";

int main(int argc, char* argv[]){
    char* heapVar = malloc(7 * sizeof(char));
}

では、globalVarとheapVarの違いと類似点は何ですか?

前もって感謝します。

4

3 に答える 3

2

グローバル変数とヒープ変数は2つの異なる概念です。ヒープ変数は単に変数のスペースが割り当てられた場所を示し、グローバル変数は変数のスコープを示します。

グローバルとは、変数がすべてのユーザーに表示されることを意味し、ローカルとは対照的に、変数の表示が制限されることを意味します。

ヒープとは、変数(ポインター)が動的に割り当てられたことを意味し(例:mallocを使用)、変数が動的に割り当てられなかったスタックとは対照的です。

したがって、グローバルヒープ変数、グローバルスタック変数、ローカルヒープ変数、またはローカルスタック変数を使用できます。

あなたの場合、globalVarは関数のスコープ(中括弧)の外で宣言されているのでグローバルですが、heapVarはmainに対してローカルです。mallocが呼び出されたため、heapVarがヒープ上で宣言されます。globalVarは、char *宣言を使用しているため、特殊なケースです。

char *スタイル宣言の処理方法の詳細については、「 ヒープまたはスタック? 」を参照してください。C++の関数呼び出しで定数文字列が参照される場合

于 2012-12-26T14:03:34.677 に答える
0

グローバル変数は常に存在し、消えることはありません。さらに、そのファイル/モジュール内のすべての関数に表示され、「静的」として宣言されていない限り、ファイル/モジュール全体にも表示されます。

グローバル変数は「これは文字列です」ではなく、単なるポインタ(メモリ内のアドレスを含む)であるglobalVariableのみであることに注意してください。

heapVar変数には、ヒープ上の何かへのアドレスが含まれています。その変数は、main()関数内でのみ表示されます。

ヒープを指すようにグローバル変数を作成できます。

ここでの違いは、globalVariableが指すコンテンツは静的に割り当てられ、heapVarが指すコンテンツは動的に割り当てられることです(free()を呼び出してメモリを解放することで破棄できますが、その文字列で使用されるメモリを解放することはできません。 string "、これはglobalVarが指すコンテンツです)。

于 2012-12-26T14:05:46.940 に答える
0

注意:ここでは、globarVarとheapVarについて話しますが、それらが指しているメモリについては話しません。
違いは次のとおりです。

スコープ

heapVarはヒープではなくスタックにあるため、そのスコープはその関数に対してローカルであり、globarVarはどこでも評価できます。

生活

heapVarは関数呼び出しが終了すると停止し、globarVarはプログラムの全期間中存続します。

彼らが指している記憶について:

heapVarが指すメモリはヒープ内にあり、globarVarが指すメモリは実装定義の読み取り専用メモリ内にあるため、安全のためにconstchar*にします。

char* globalVar = "This is a string";

ヒープ内のメモリはいつでも解放でき、リテラル文字列はプログラムの全期間にわたって存続します。あなたの場合、あなたは漏れを抱えています。とにかく、これは単なる例であると私は理解しています、多分あなたはそれを知っています。

于 2012-12-26T14:27:21.237 に答える