web-dev-qa-db-ja.com

警告:代入は、キャストなしでポインターから整数を作成します

char *を固定文字列に宣言し、ポインターを再利用して別の文字列を指す場合

/* initial declaration */
char *src = "abcdefghijklmnop";
.....

/* I get the   "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";

ポインターを再作成しようとしましたが、成功しませんでした。

25
lcutler

表現 *srcは、文字列全体ではなく、文字列の最初の文字を指します。 srcを別の文字列tgtを指すように再割り当てするには、src = tgt;

31

文を書くとき

*src = "anotherstring";

コンパイラは、定数文字列"abcdefghijklmnop"を配列のように認識します。代わりに次のコードを書いたと想像してください。

char otherstring[14] = "anotherstring";
...
*src = otherstring;

今、何が起こっているかが少し明確になりました。左側の*srccharsrccharへのポインター型であるため)を参照しますが、右側はotherstringは、ポインターを指します。

ポインタが指すアドレスを保存したい場合があるため、これは厳密に禁止されていません。ただし、通常、明示的なキャストが使用されます(あまり一般的ではありません)。あなたのコードはあなたが思っていることをしていない可能性が高いため、コンパイラは赤旗を投げています。

文字列を割り当てようとしているように見えます。 Cの文字列は、C++のようなデータ型ではなく、char配列で実装されます。しようとしているように、文字列に値を直接割り当てることはできません。代わりに、strncpyなどの関数と<string.h>のフレンドを使用し、charポインターの代わりにchar配列を使用する必要があります。ポインタが別の静的文字列を指すようにするだけの場合は、*をドロップします。

29
bta

警告は、割り当てでsrcを間接参照しているという事実に由来しています。式*srcの型はcharです。これは整数型です。式"anotherstring"の型はchar [14]であり、この特定のコンテキストでは暗黙的に型char *に変換され、その値は配列の最初の文字のアドレスです。そのため、ポインター型の値を整数型に割り当てようとすると、警告が表示されます。 *から*srcをドロップすると、期待どおりに動作するはずです。

src = "anotherstring";

srcのタイプはchar *であるためです。

5
John Bode

ジェレマイアが言ったことに加えて、コンパイラーは警告を発行します。

*src ="anotherstring";

言います:「anotherstring」のアドレスを取得-「anotherstring」IS a charポインター-そしてそのポインターをsrc(* src = ...)を介して間接的に最初のcharに格納しますstring "abcdef ..."あなたのコードのどこにも整数の言及がないので、警告は当惑するかもしれません:警告は無意味に見えます。しかし、カーテンの後ろに見えないのは、「int」と「char」両方とも同じビット数を使用します。コンパイラは、整数に格納しているという警告を発行する場合、区別しません。このコードで。

-ピート

0
Pete Wilson