発生している問題・エラーメッセージ
現在ポインタについて学習中なのですが、入力した数字に対応する月の名前を返す関数GetOldMonthを作成するという問題で下記のようなソースコードを作成しました。 ポインタに格納されたアドレスが指す値を参照するには「*ポインタ名」とすると思うのですが、下記のプログラムで「*name」とすると先頭の一字のみ出力されます。(3月の場合はyなど) なぜ、「*name」ではなく「name」で正しく出力がされるのでしょうか? 初歩的な質問で申し訳ありませんがご回答いただけると幸いです。よろしくお願いします。
該当のソースコード
C++
1 2const char* const MONTH_NAME[]= 3{ 4 "mutsuki","kisaragi","yayoi","uduki", 5 "satsuki","minatsuki","hutsuki","hatsuki", 6 "nagatsuki","kannaduki","shimotsuki","shiwasu" 7}; 8 9const char* GetOldMonthName(int month) 10{ 11 if(1<=month&&month<=12) 12 { 13 return MONTH_NAME[month-1]; 14 } 15} 16 17int main() 18{ 19 int month; 20 std::cin>>month; 21 const char * name=GetOldMonthName(month); 22 std::cout<<name; 23} 24
GetOldMonthName()でif文に入らなかった時(13月とか)はどうするのしょうか?
・・・ワーニングにならないのかなぁ・・・
clang version 13.0 →warning: non-void function does not return a value in all control paths
usr ~/Project/cpp % ./a.out
13
Segmentation fault (core dumped)
「ポインタについて学習中で」「初歩的な質問」と断りがある割りに質問に取り挙げているコード部分は
> const char *name = "hoge";
> std::cout << name;
で、実はstd::basic_ostream の << 演算子のオーバーロードの話になっているので、何気に難しく、「ポインタが指す値の参照方法」から話が離れていっている気がします。