int
配列を引数として取る関数があります。配列はint
文字列を表していますが、含むことができる必要があるEOF
ため、型にすることはできませんchar[]
。私の関数は次のようになります。
_Bool fun(int str[]) {
// does something involving checking elements for EOF, e.g.:
return (str[0]==EOF);
}
テスト目的で、文字列リテラルで呼び出したいと思いますfun
(ただし、文字列リテラルは型char[]
であり、を含めることはできませんEOF
)。
fun("test");
これはコンパイルされますが、引数の型が間違っているという警告が表示されます。文字列リテラルはchar[]
であり、引数は であるため、これは予期されることですint[]
。
私はこれを行うことができます:
fun( (int*) "test");
これはおそらく同等です。キャストを明示的に行っているだけで、同じコンパイル警告が表示されます。
char*
へのキャストが機能することint*
が保証されていないことを読んでいます(リンク)。int
これは一般的なケースでは当然のことです。大きなをに書き込もうとするとstr[some_index]
、収まらない可能性があるためです。str[some_index]
メモリは a に割り当てられているだけchar
です (ここで間違っている場合は教えてください)。
しかし、私はそのような書き込みを行うのではなく、単に比較するだけなので (char と int の比較は問題ないはずです)、上記のいずれかで問題ありませんか? その場合、コンパイル警告を取り除くにはどうすればよいですか? または、これを解決する最善の方法は何でしょうか?
char
もちろん、文字列リテラルが与える配列を値ごとに値としてコピーする単純な関数を作成することもできint
ますが、もっと良い方法があるはずです。このようなソリューションは、メモリも浪費します。
(ちなみに、 でテストするときはEOF
、次のようにします。
int str[] = {'t', 'e', 's', 't', EOF};
fun(str);
これは正常に動作するはずです。)