- ベストアンサー
なぜエラーが出るのでしょうか?
C++のプログラム中、疑問に思ったことがありましたので質問させていただきます。 下記のプログラムを実行するとエラーになります。その原因をご存知の方がおりましたら教えてください。 char* str; cin >> str; cout << str; cout << endl; これを void main() などに書きまして実行するとエラーが出ます。 [str]が配列の数を指定していないので無限に文字を入力でき、それを表示させるという簡単なプログラムですが、[str]をこのように使うとエラーになるのはなぜでしょうか。プログラムに詳しい人に聞いても『そういう仕組みだからそうなるのだろう』と言われるだけです。 普通、[str]を使うとき、[ ]を使って配列で使うのだと思いますが、『無限に文字を入力できる』ように、上のパターンでプログラムを書くとエラーが出るのはなぜなのかよくわかりません。 もしご存知の方がおりましたらお教えください。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
char* str; はchar型のポインタを入れておく変数の宣言で、 そのままではゴミが入ってます。 int i; と一緒でそれだけでは意味をなしません。 i = 10; と初期化するのと同様に、strにも何か入れないといけません。 例えば、 char buf[10]; str = buf; 等です。 無限に文字を入力させるには、 文字を一文字づつ取ってきてて、領域がいっぱいになったら その都度拡張させるような仕組みにしなければいけません。
その他の回答 (3)
エラーの理由に関しては皆さんのおっしゃる通りだと思います。 batacha さんが、上のようなコードが正しいと思った原因は、おそらく、 配列とポインタとの違いがよくわかっていないからではないでしょうか。 配列 a[n] の配列名 a はポインタに似た性質を持ちますが、 (char型だとして) char* a; 等で宣言されるポインタ変数とは異なる ものだと言うことに注意が必要です。 下の参考URLの第6章が参考になるかと思います。他にも疑問が湧いた場合 はまず下のページを覗いてみると良いかもしれません。 また、せっかくC++を使っているのならstring型を使えばbatachaさんが やりたいことが実現できますよ。これについては適当なテキストを参考に してみてください。
お礼
文面からかなりお詳しい方だと思いました。 ポインタに関しては勉強しなおすことにいたします。 下記のお礼に書きましたように、最初なぜ質問しようと思ったのかといいますと、『不正な処理』というエラーメッセージが出たからでした。 ですが、皆さんのお答えから『初期化』というものが絶対に必要であるということがよくわかりました。 お答えいただいた皆さんに感謝しております。 ありがとうございました。
- terra5
- ベストアンサー率34% (574/1662)
> [str]が配列の数を指定していないので無限に文字を入力でき とありますが、指定が無いと無限に入力できるというのが そもそも間違いです。 無限に文字を入力し保存できるような物はこの世にありません。 また、このような書き方をすると無限どころか、 入力できるところが一つも無い状態になります。 普通に、配列を使ってください。 どうしても、無限にしたいのなら、 一文字分だけ入力して、一文字出力を無限に繰り返すことなら可能なので, そうプログラムしてください。 繰り返しだけなら,論理上無限にできますから。
お礼
やはり配列を作らないとダメということですね。 ごもっともです。初期化は必要だと言うことがよくわかりました。 ご指摘ありがとうございました。
- akishizuma
- ベストアンサー率43% (21/48)
C++は分からないのですが Cだと分かるので(一応Cは専門家なので) ポインタ宣言しただけだとポインタの格納領域を取っただけで ポインタが指し示す領域は生成されないです。 C++だと char* str;でポインタ宣言しただけで 入力文字を格納する領域も生成されるのでしょうか。 あ~、逆に質問になっている。すいません。気にしないで下さい。
お礼
御礼が遅くなり申し訳ありませんでした。 [C]の専門家なのですね。ポインタは[C]も共通してますからアドバイスはとても参考になりました。 ありがとうございました。
お礼
やはり絶対に初期化することは必要なのですね。 初期化しなくても使えるのかどうか試してみたわけです。 また、本当にわからなかったことは、このエラーが『不正な処理』というメッセージになるのがなぜかということでした。 不正な処理として強制終了のようになることが疑問に思ったので質問させていただいたわけです。 ですが、お答えいただいたことはとても参考になりましたので感謝しております。 ありがとうございました。