1

入力const文字列が何らかの方法で変更されている場合(Cコンパイラの警告が発生します)、それを処理するための最良の方法は何ですか?新しい変数に型キャストしてから使用するか、複製して使用してから解放します。または、このタイプのシナリオを処理する他の方法はありますか。提案してください。どんな助けでもいただければ幸いです。

//型キャスト

const char * s1;
char * s2 = (char *)s1;

//複製して無料

const char * s1;
char * s2  = strdup( s1 );
free(s2)

編集:それはCコンパイラです。C++ではありません。型キャストで、s2が文字列s1の新しいコピーになるのか、それとも元の文字列s1を指すのかわかりません。

答えてくれてありがとう。もう1つ疑問があります-

const char * c1;
const char * c2 = c1;

上記の割り当ては有効ですか?

4

3 に答える 3

5

ここでconstをキャストすると、コンパイラがシャットダウンする可能性がありますが、ランタイムエラーが発生します。文字列のコピーを作成し、それに取り組みます。

constをキャストしても、メモリの内容はコピーされません。同じメモリへのポインタを作成し、すぐにそのメモリに書き込むことができることをコンパイラに通知します。メモリが読み取り専用の場合は、保護違反があります。さらに深刻なことに、デバッグが難しい正確性の問題が発生する可能性があります。constを捨てないでください。

もちろん、変数を変更し、それらの変更を呼び出し元に表示する必要がある場合は、そもそも変数をconstにしないでください。一方、変更が関数専用であることが意図されている場合は、constパラメーターの複製が最適です。

大まかなルールとして、可能な限りキャストを避けるように努める必要があります。キャストは、エラーの最も頻繁な原因の1つです。

于 2011-10-11T06:34:16.577 に答える
2

s1を指す配列がである場合は、const変更しないでください。そうすることで、未定義の動作が発生します。その場合、それを変更する必要がある場合は、コピーをとる必要があります。更新:型キャストは同じ配列へのポインターを提供しますが、それはまだconstですので、変更してはいけません(そうしようとしてもコンパイルエラーは発生しなくなります)。

配列がではないことを保証できる場合は、ポインタからconstキャストすることで配列を変更できます。その場合、そもそも修飾子をconst追加しないことでその保証を適用できれば、エラーが発生しにくくなります。consts1

于 2011-10-11T06:57:44.027 に答える
0

入力がaのconst char*場合は、コンパイラの警告を必ず聞いて、そのままにしておく必要があります。

于 2011-10-11T06:34:29.007 に答える