2013-09-30 3 views
5

はのは、私のような何かを言ってみましょうか?これは自動的に私が解放する必要があるメモリを作成していますか?私は一種の混乱している。ありがとう。このアレイを作成するときに割り当てられるメモリはどこですか?まさに私はそれを長い道のりをした場合には、この等価では何</p> <pre><code>char* test[] = {"foo","bar","car"}; </code></pre> <p>:(C)

+2

「malloc」や「mmap」などを使って作成したa)メモリを解放する必要があるか、b)明示的に文書化する関数* *そうする責任はあなたにある。 –

答えて

2

testは、スタックにあるcharへのポインタの配列であり、文字列リテラル"foo","bar""car"は読み取り専用の場所に格納されます。あなたは何も解放する必要はありません。

test[0],test[1],test[2]は読み取り専用データを指します。スコープの規則と変数のC言語の有効期間について読むことをお勧めします。ブロック内でストレージクラス指定子を持たない変数のデフォルト値はautoです。これはローカルライフタイムの変数です。

char* test[] = {"foo","bar","car"}; 
test[1][0] = "tar"; // Run-time error 

しかし、これは結構ですがtest[0]開始は"foo"から"new"を指すように:

test [0] ="new"; 

{ 
    char* test[] = {"foo","bar","car"}; 
} 
//cannot access test here 
test [0] = "new"; // Compile time error - ‘test’ undeclared 

は "タール" は、ランタイムエラーを与えるために、 "バー" を変更しようとしますが "foo"への参照は失われます。

+0

これらの値は読み取り専用の場合は変更できません。 test [0] = "foo2"と言うことができませんか? – zProgrammer

+0

文字列リテラルは、ポインタ自体ではなく、読み取り専用の場所に格納されます。ポインタはブロック内でローカルな有効期間を持ちます。 – Sadique

+0

最後の質問:「char * x」と「char x [10]」との違いは何ですか? – zProgrammer

0

mallocとmallocを文字列のサイズで使用するのがずっとです。

テストは、あなたがポインタの配列を宣言している

http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

+0

'malloc'はヒープ上にメモリを割り当てます。それは間違っているか、少なくとも誤解を招き、 "mallocがスタックにスタックする"と言ってしまいます。 – icktoofay

5

ヒープ上にプッシュされます。ポインターは文字列リテラルを指します。

変数testは、通常の規則に従います。自動変数(一部の関数内のスコープ)であれば、関数外でスコープから外れるので、メモリを解放する必要はありません。静的に割り当てられている場合(グローバル変数またはstatic変数)、プログラムと同じ長さのため、メモリを解放する必要はありません。

ポインターが指し示す文字列リテラルは静的記憶域を持つため、解放しないでください。

0

Testcharecter pointersの配列です。配列の値の初期化が行われると、Cは角括弧を空のままにすることができます。この場合、コンパイラは、中括弧{ }の間に含まれる値の数と一致する配列のサイズを想定します。自由にする必要はありません。

関連する問題

 関連する問題