char *
を固定文字列に宣言し、ポインターを再利用して別の文字列を指す場合
/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";
ポインターを再作成しようとしましたが、成功しませんでした。
表現 *src
は、文字列全体ではなく、文字列の最初の文字を指します。 src
を別の文字列tgt
を指すように再割り当てするには、src = tgt;
。
文を書くとき
*src = "anotherstring";
コンパイラは、定数文字列"abcdefghijklmnop"
を配列のように認識します。代わりに次のコードを書いたと想像してください。
char otherstring[14] = "anotherstring";
...
*src = otherstring;
今、何が起こっているかが少し明確になりました。左側の*src
はchar
(src
はchar
へのポインター型であるため)を参照しますが、右側はotherstring
は、ポインターを指します。
ポインタが指すアドレスを保存したい場合があるため、これは厳密に禁止されていません。ただし、通常、明示的なキャストが使用されます(あまり一般的ではありません)。あなたのコードはあなたが思っていることをしていない可能性が高いため、コンパイラは赤旗を投げています。
文字列を割り当てようとしているように見えます。 Cの文字列は、C++のようなデータ型ではなく、char
配列で実装されます。しようとしているように、文字列に値を直接割り当てることはできません。代わりに、strncpy
などの関数と<string.h>
のフレンドを使用し、char
ポインターの代わりにchar
配列を使用する必要があります。ポインタが別の静的文字列を指すようにするだけの場合は、*
をドロップします。
警告は、割り当てでsrc
を間接参照しているという事実に由来しています。式*src
の型はchar
です。これは整数型です。式"anotherstring"
の型はchar [14]
であり、この特定のコンテキストでは暗黙的に型char *
に変換され、その値は配列の最初の文字のアドレスです。そのため、ポインター型の値を整数型に割り当てようとすると、警告が表示されます。 *
から*src
をドロップすると、期待どおりに動作するはずです。
src = "anotherstring";
src
のタイプはchar *
であるためです。
ジェレマイアが言ったことに加えて、コンパイラーは警告を発行します。
*src ="anotherstring";
言います:「anotherstring」のアドレスを取得-「anotherstring」IS a charポインター-そしてそのポインターをsrc(* src = ...)を介して間接的に最初のcharに格納しますstring "abcdef ..."あなたのコードのどこにも整数の言及がないので、警告は当惑するかもしれません:警告は無意味に見えます。しかし、カーテンの後ろに見えないのは、「int」と「char」両方とも同じビット数を使用します。コンパイラは、整数に格納しているという警告を発行する場合、区別しません。このコードで。
-ピート