OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

なぜエラーが出るのでしょうか?

  • 暇なときにでも
  • 質問No.128035
  • 閲覧数59
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 62% (52/83)

C++のプログラム中、疑問に思ったことがありましたので質問させていただきます。
 下記のプログラムを実行するとエラーになります。その原因をご存知の方がおりましたら教えてください。

 char* str;
cin >> str;
cout << str;
cout << endl;

 これを void main() などに書きまして実行するとエラーが出ます。
 [str]が配列の数を指定していないので無限に文字を入力でき、それを表示させるという簡単なプログラムですが、[str]をこのように使うとエラーになるのはなぜでしょうか。プログラムに詳しい人に聞いても『そういう仕組みだからそうなるのだろう』と言われるだけです。
 普通、[str]を使うとき、[ ]を使って配列で使うのだと思いますが、『無限に文字を入力できる』ように、上のパターンでプログラムを書くとエラーが出るのはなぜなのかよくわかりません。
 もしご存知の方がおりましたらお教えください。
 よろしくお願いいたします。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル9

ベストアンサー率 40% (43/105)

char* str;
はchar型のポインタを入れておく変数の宣言で、
そのままではゴミが入ってます。
int i;
と一緒でそれだけでは意味をなしません。
i = 10;
と初期化するのと同様に、strにも何か入れないといけません。
例えば、
char buf[10];
str = buf;
等です。

無限に文字を入力させるには、
文字を一文字づつ取ってきてて、領域がいっぱいになったら
その都度拡張させるような仕組みにしなければいけません。
お礼コメント
batacha

お礼率 62% (52/83)

やはり絶対に初期化することは必要なのですね。
初期化しなくても使えるのかどうか試してみたわけです。
また、本当にわからなかったことは、このエラーが『不正な処理』というメッセージになるのがなぜかということでした。
不正な処理として強制終了のようになることが疑問に思ったので質問させていただいたわけです。
ですが、お答えいただいたことはとても参考になりましたので感謝しております。
ありがとうございました。
投稿日時 - 2001-09-09 00:27:51
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル8

ベストアンサー率 43% (21/48)

C++は分からないのですが Cだと分かるので(一応Cは専門家なので) ポインタ宣言しただけだとポインタの格納領域を取っただけで ポインタが指し示す領域は生成されないです。 C++だと char* str;でポインタ宣言しただけで 入力文字を格納する領域も生成されるのでしょうか。 あ~、逆に質問になっている。すいません。気にしないで下さい。 ...続きを読む
C++は分からないのですが

Cだと分かるので(一応Cは専門家なので)
ポインタ宣言しただけだとポインタの格納領域を取っただけで
ポインタが指し示す領域は生成されないです。
C++だと
char* str;でポインタ宣言しただけで
入力文字を格納する領域も生成されるのでしょうか。
あ~、逆に質問になっている。すいません。気にしないで下さい。
お礼コメント
batacha

お礼率 62% (52/83)

御礼が遅くなり申し訳ありませんでした。
[C]の専門家なのですね。ポインタは[C]も共通してますからアドバイスはとても参考になりました。
 ありがとうございました。
投稿日時 - 2001-09-09 00:23:44


  • 回答No.3
レベル13

ベストアンサー率 34% (574/1662)

> [str]が配列の数を指定していないので無限に文字を入力でき とありますが、指定が無いと無限に入力できるというのが そもそも間違いです。 無限に文字を入力し保存できるような物はこの世にありません。 また、このような書き方をすると無限どころか、 入力できるところが一つも無い状態になります。 普通に、配列を使ってください。 どうしても、無限にしたいのなら、 一文字分だけ ...続きを読む
> [str]が配列の数を指定していないので無限に文字を入力でき

とありますが、指定が無いと無限に入力できるというのが
そもそも間違いです。
無限に文字を入力し保存できるような物はこの世にありません。

また、このような書き方をすると無限どころか、
入力できるところが一つも無い状態になります。

普通に、配列を使ってください。


どうしても、無限にしたいのなら、
一文字分だけ入力して、一文字出力を無限に繰り返すことなら可能なので,
そうプログラムしてください。
繰り返しだけなら,論理上無限にできますから。
お礼コメント
batacha

お礼率 62% (52/83)

やはり配列を作らないとダメということですね。
ごもっともです。初期化は必要だと言うことがよくわかりました。
ご指摘ありがとうございました。
投稿日時 - 2001-09-09 00:29:40
  • 回答No.4

エラーの理由に関しては皆さんのおっしゃる通りだと思います。 batacha さんが、上のようなコードが正しいと思った原因は、おそらく、 配列とポインタとの違いがよくわかっていないからではないでしょうか。 配列 a[n] の配列名 a はポインタに似た性質を持ちますが、 (char型だとして) char* a; 等で宣言されるポインタ変数とは異なる ものだと言うことに注意が必要です。 下 ...続きを読む
エラーの理由に関しては皆さんのおっしゃる通りだと思います。

batacha さんが、上のようなコードが正しいと思った原因は、おそらく、
配列とポインタとの違いがよくわかっていないからではないでしょうか。
配列 a[n] の配列名 a はポインタに似た性質を持ちますが、
(char型だとして) char* a; 等で宣言されるポインタ変数とは異なる
ものだと言うことに注意が必要です。

下の参考URLの第6章が参考になるかと思います。他にも疑問が湧いた場合
はまず下のページを覗いてみると良いかもしれません。

また、せっかくC++を使っているのならstring型を使えばbatachaさんが
やりたいことが実現できますよ。これについては適当なテキストを参考に
してみてください。
お礼コメント
batacha

お礼率 62% (52/83)

文面からかなりお詳しい方だと思いました。
ポインタに関しては勉強しなおすことにいたします。
下記のお礼に書きましたように、最初なぜ質問しようと思ったのかといいますと、『不正な処理』というエラーメッセージが出たからでした。
ですが、皆さんのお答えから『初期化』というものが絶対に必要であるということがよくわかりました。
お答えいただいた皆さんに感謝しております。
ありがとうございました。
投稿日時 - 2001-09-09 00:33:34
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ