1

これは良い習慣ですか?コードはコンパイルされて実行されますが、これがCコードでエミュレートするための良い習慣であるかどうか疑問に思います。

  1. 私達は書くconst char *str1 = "abc";
  2. その後、char *str2動的に割り当てられたメモリを指すポインタ変数があるとしましょう
  3. 次に、str1 = str2両方を実行し、動的に割り当てられたメモリstr1をポイントしますstr2

そのため、へのポインタを追跡できなくなりました"abc"。このコードでは必要ないかもしれませんが、これらを処理するための最良の推奨方法は何でしょうか。

全体的な問題は、最初にabcに宣言され、後でユーザー入力に依存する文字列が必要なことです。ユーザーが指定した文字列を使用したい場合があります。

4

3 に答える 3

3

それは絶対に大丈夫です。const char *str1「(このポインタを介して)変更できない文字データへの、変更可能なポインタ」を意味します。

したがって、好きな文字列を指すことができstr1、さまざまな時間にさまざまな文字列を指すように「再装着」するのが理にかなっています。

明らかに、コードが十分に複雑な場合、読者が変数に現在含まれているものを理解するのを困難にする可能性がありますが、それはすべての変数に当てはまります。たとえば、文字列リテラルを指すこともあれば、動的に割り当てられたメモリを指すこともあるポインタに注意する必要があります。これは、ポインタをfree編集する必要があるかどうかが常に明確であるとは限らないためです。

常に同じ文字列をポイントしたい場合str1は、それを定義しますconst char * const str1(または、常に一貫したchar const *const str1位置にするために)。constこの場合、それはあなたが望むものではなく、str1constを宣言していないという事実は、読者に多くのことを示しています。

于 2013-02-15T11:00:05.670 に答える
1

文字列リテラルへのポインタを失ってもメモリリークは発生しないため、その点では安全です。

于 2013-02-15T10:17:54.543 に答える
1

文字列リテラル"abc"は動的に割り当てられないため、この状況でリークする可能性のあるものはありません。

文字列リテラルは、オペレーティングシステムの実行可能ローダーによって起動時にメモリにロードされる「プログラムイメージ」の一部です。このイメージが占めるスペースは、プロセスが終了すると、オペレーティングシステムによって再利用されます。もちろん、デマンドページングやコピーオンライトなどの手法があるため、これは正確ではありませんが、その場合は関係ありません。

constあなたがその定義を入れなかったらそれは問題になるでしょう。後者を使用すると、通常はプロセスの読み取り専用領域に格納されているメモリの一部を変更しようとすることができるため、未定義の動作が発生します。

于 2013-02-15T10:25:27.290 に答える