2016-09-15 5 views
-2

私がしたいのはchar** stringarrです。c:空きchar *破棄せずに**

一部の地域では、stringarr[index]char*を割り当てたいとします。 だから、char **のいくつかの場所に文字列(char*)を保存したいと思います。例えば プログラムが実行された後:

stringarr[0] = "Hello", stringarr[1] = "goodbye" 

を問題は、私はchar *は、文字列を保持して解放したいということではありませんが、私は、もちろんやるときstringarr[0]もはや解放されたchar*を指します。

どうすればこの問題を解決できますか?

明確にする: 文字列配列(char **)に文字列(char *)を追加したいとします。その後、私は文字列を解放しますが、文字列配列は解放しません。 char **に影響を与えることなく、どうすればこのことができますか?

+2

_具体的な問題を明確にしたり、詳細を追加して必要なものを正確に強調してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明確にする方法については、How to Askページを参照してください。 –

+0

[How to ask page](http://stackoverflow.com/help/how-to-ask) – gavv

+0

上記のコードは 'stringarr [0]'をポイントするように設定しています解放されない文字列リテラルに変換します。あなたができることは 'stringarr [0]'を 'NULL'のようなものに設定することです。代わりに 'char * foo = malloc(10);のようなことをします。 strcpy(foo、 "fred"); stringarr [0] = foo; 'を呼び出し、後で' free(foo) 'を呼び出すと、' stringarr [0] 'が指すバッファに決してアクセスしないようにあなたのコードに任されます。それを達成する方法はあなた次第です。あなたのコードが 'foo'を解放した後に' stringarr [0] = NULL; 'を再設定し、常に' stringarr [0] 'がNULLかどうかをチェックすることを確実にすることは、それを達成する一つの方法です。 –

答えて

1

これを処理する通常の方法は、解放されたポインタ(S)にNULLを割り当てることです:

free(stringarr[3]); 
stringarr[3] = NULL; 
あなたはまだ stringarr(ただし、 stringarr[3])で他の文字列にアクセスすることができますし、特定のかどうかを確認することができます

それがNULLであるかどうかによってチェックされます。

+0

これはどのように機能しますか?私はchar **を持っていますstringarr、場所stringarr [0]私はchar * tmpを持っています。それから、stringarr [0]を解放してNULLに設定しますか?そしてまだ私は0の文字列を持っていて、文字列は解放されていますか? – p3ob2lem

+0

あなたは文字列を保持したいですか?その後、それらを解放しないか、 'strdup'を使ってコピーを作成してください。 –

+0

はいメソッドからstringarrを返すので、文字列をstringarrに保持します。 – p3ob2lem