ページ 11

新・明解c言語の演習問題での疑問です

Posted: 2017年6月09日(金) 00:03
by SZK
新・明解c言語演習11-6
「文字列sの中に、文字cが含まれていれば、その文字へのポインタを返し、含まれていなければ空ポインタを返す関数を作成せよ。添字演算子を用いずに実現すること」
 char *str_chr(const char *s, int c) { /* ... */ }

この課題を解いている最中です。課題の答えも知りたいのですが、それ以前に納得できないエラーが出たので質問します。プログラムとエラーは以下の通りです。

書いた関数
char *str_chr(const char *s, int c)
{
int *t = s;
return t;
}

エラー
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   char *t = s ;
       ^

どうもconstの影響で関数内のポインタに値を代入できないようなのですがポインタの内部をいじっているわけでは無く、なぜエラーとなるのか理解できません。
また、課題にはconstを用いることが指定されているので、このエラーが出る限り、この課題の答えも分かりません。
分かる方、お返事待っております。

Re: 新・明解c言語の演習問題での疑問です

Posted: 2017年6月09日(金) 00:20
by みけCAT
SZK さんが書きました:それ以前に納得できないエラーが出たので質問します。
warningと書いてありますが、本当にエラーが出たのですか?
SZK さんが書きました: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
   char *t = s ;
       ^
メッセージの通り、constがついているポインタをconstがついていないポインタに代入しているので、
(constがついていないポインタを経由してconstがついているポインタが指している値を書き換えられてしまうかもしれないので)よくないと言っています。
tの型はconstがついていないだけでなく、(const )char型へのポインタを代入するのにint型へのポインタであるのもよくないですね。

…待てよ、コードはint *t = s;なのに、メッセージはchar *t = s ;なのはおかしいですね。
あなたが見ているコードとコンパイラが見ているコードが同じになるように注意してください。
・エディタでソースコードを保存した後にコンパイルしてください。
・ソースコードは正しい位置に保存してください。 (別のディレクトリの同名ファイルをコンパイルしていませんか?)

Re: 新・明解c言語の演習問題での疑問です

Posted: 2017年6月09日(金) 00:58
by SZK
申し訳ありません。tはintではなくcharで定義しました。質問する際に打ち間違えたようです。
エラーではなく注意文ですね。無理やり実行することもできるのですが、何が問題なのか知りたくて質問したしました。
回答ありがとうございます。ポインタを経由して書き換えられることがある、という点は知りませんでしたし、考え付きませんでした。

Re: 新・明解c言語の演習問題での疑問です

Posted: 2017年6月09日(金) 01:02
by box
SZK さんが書きました:質問する際に打ち間違えたようです。
わざわざ手打ちするよりもコピペする方が正確で楽だと思いませんか?