15

重複の可能性:
C 文字列リテラル: どこに行くの?

私の知る限りでは、

一般に、ポインターは malloc() によって割り当てられる必要があり、ヒープに割り当てられ、次に free() によって割り当て解除されます。

非ポインター (int、char、float など) は自動的にスタックに割り当てられ、関数が戻るまでは割り当てられません。

しかし、次のコードから:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

どこにa割り当てられますか? スタックまたはヒープ?

4

2 に答える 2

18

文字列リテラルはデータ セグメントに割り当てられます。それへのポインタ がaスタックに割り当てられます。

コードは最終的にコンパイラによって次のように変換されます。

#include <stdio.h>

const static char literal_constant_34562[7] = {'t', 'e', 's', 'a', 'j', 'a', '\0'};

int main()
{
    char *a;

    a = &literal_constant_34562[0];

    return 0;
}

したがって、あなたの質問に対する正確な答えは:どちらでもないです。Stackdatabss、およびheapは、すべてメモリの異なる領域です。Const static 初期化変数はdataになります。

于 2011-02-11T15:30:26.547 に答える
11

aそれ自体 (ポインター) は、autoストレージ クラスを使用して (暗黙的に) ローカル変数として定義されるため、スタック (または実装がスタックのような割り当てに使用する任意のメモリ -- IBM メインフレームや最初の Cray などの一部のマシン) に割り当てられます。 、通常の意味での「スタック」はありません)。

文字列リテラル「tesaja」は静的に割り当てられます。それがどこにあるのかは、実装によって異なります。他のデータと一緒に配置するものもあれば、読み取り専用データ セグメントに配置するものもあります。すべてのデータを読み取り/書き込みとして扱い、すべてのコードを読み取り専用として扱うものもあります。文字列リテラルを読み取り専用にしたいので、コードセグメントに入れます。

于 2011-02-11T15:35:00.277 に答える