3

char ポインターへの動的メモリ割り当てに関連する奇妙な問題があります。私は次のようなものを持っています

char *input = new char; //1
gets(input) //2
char *dest = new char; //3

ステップ 3 で、実行時にヒープ破損エラーが発生します。これは、入力する文字列の長さが 23 文字を超える場合にのみ発生します。

新しい操作をしなければ問題ありません。

指定すると、この問題は解決します

 char *input = new char[100]; 

しかし、ユーザーの入力に基づいて入力を動的にしたいのです。

この場合の 24 バイトの役割はわかりません。100文字または数n文字に制限したくありません...メモリ割り当てが苦手です...誰かがこのシナリオを説明できますか?

4

5 に答える 5

6

いいえ、その方法はできません。静的バッファのみを使用するか、次の「cpp-way」を使用できます。

std::string str;
std::getline(std::cin, str);
于 2012-12-24T14:12:47.357 に答える
5

getsnull ターミネータが追加されるため、ゼロより大きい任意の長さの入力に対して、プログラムは未定義の動作を示します。プログラムが 23 文字までクラッシュしないという事実は、不幸な偶然です。

getsバッファを動的に割り当てる場合は、 orcharベースの入力を使用しないでください。代わりに、データをstd::string.

于 2012-12-24T14:15:39.303 に答える
2

ユーザーが入力する長さがわからず、ユーザー入力を制限したくない場合は、十分な長さのバッファーを割り当てる必要があります。STL文字列を使用することもできますが、動的に十分なメモリを割り当てます.プログラムへの割り当ての詳細を隠すだけです.

于 2012-12-24T14:16:59.090 に答える
1

絶対に使用しないでgets()ください(manページから):

バッファ オーバーランのチェックは実行されません

そこに何を入力したかによって、バッファ オーバーフローが発生します。

于 2012-12-24T14:14:45.153 に答える
0
new char

1 文字にメモリを割り当てます。2 番目の文字の後で失敗する可能性があります (実際には、'\0' 文字を取得するため、最初の文字の後でも失敗します。

質問に C ではなく C++ のタグを付ける場合は、C++ を使用してください。つまり、 std::string を使用することを意味します

于 2012-12-24T14:18:30.603 に答える