3
#include <iostream>

using namespace std;

int main() {
    char * c;
    cin >> c;
    return 0;
}

長さがわからないユーザーから C 文字列行を取得しようとしています。その代わりにcasを宣言しても、セグメンテーション違反が発生しないことはわかっています。char c[80]char * c

80 - 1ただし、ユーザーを文字に制限したくない場合はどうすればよいでしょうか? 非常に大きな数を使用することもできますが、それはスペースを浪費するだけです。

また、上記のプログラムがセグメンテーション違反を引き起こす理由も知りたいです。私が理解していることから、cin抽出演算子 ( )は C 文字列>>を終了することを知っています。NULL問題の原因は正確には何ですか?

4

3 に答える 3

7

ポインターcが初期化されていないため、プログラムのセグメンテーション違反が発生します。データをバッファに読み込む前に、バッファにメモリを割り当てる必要があります。

char * c = new char[80];
cin >> c;
cout << c << endl;
delete[] c; // Now you need to delete the memory that you have allocated.

入力をN文字に制限しないようにするには、文字列を使用してください。必要に応じて動的にサイズ変更します。

string c;
cin >> c;
cout << c;
// You do not need to manage string's memory - it is done automatically
于 2012-08-19T04:21:34.753 に答える
2

only を使用すると、文字列にスペースがまったく割り当てられませんchar *c;。変数宣言は、初期化されていないポインターを作成しますchar。次にcin、文字列をそのスペースに読み込むために使用します。何かcを指す可能性があり、いずれにせよあなたに属さないメモリを指します。

から文字列を埋める前に、文字列にスペースを割り当てる必要がありますcin

文字列の長さの制限を想定したくない場合はrealloc、入力が完全に読み取られるまでループしてスペースを増やすことができますが、前述のようstd::stringに、C 文字列の代わりに使用すると、これが処理されます。

于 2012-08-19T04:21:55.603 に答える
0

これは、文字列にメモリを割り当てていないためです。

于 2012-08-19T04:22:38.957 に答える