0

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?

ポインタを使用してCスタイルの配列を宣言し、関数によって返される値を割り当てました。

1.1。const char* str = chArr->readString();

上記の直後に、私は次のようにstrをcoutしたいと思います:

2.2。cout << "pointer to char is = " << str <<endl;

そしてそれreadStringは:

char* CharArray::readString()
{
    std::cout << "Insert a string of max 19 length:" <<std::endl;
    char string[20];
    std::cin.getline(string,20,'\n');
    return string;
}

2行目にブレークポイントを設定すると、正しい結果がの値として表示されますstr。しかし、コンソールウィンドウには何も表示されず、手順2を通過した後、値を見ると、 「 」または「 」のstrようなものが表示されます。P÷7äû:

たぶん、4,5の長さのstrIストリングについては言う価値があります。strの長さにもかかわらず19ではありません。

4

3 に答える 3

5

ローカル変数へのポインタを返しています。この変数のメモリ アドレスは、関数の終了後にシステムによって再び使用可能になります。そのため、他のコードがランダムなデータで上書きする可能性があり、それが意味不明な表示になっている理由です。

これを安全に行うには、次を使用します。

char* string = new char[20];

あとで思い出してくださいdelete []

于 2012-10-06T08:30:57.880 に答える
4

ローカル変数のアドレスを返しています。そのメモリは、関数を終了した後に別のものによって再利用されます。次のように代わりに std::string を返す方がはるかに優れています。

std::string CharArray::readString()
{
    std::cout << "Type a string and hit enter:" << std::endl;
    std::string str;
    std::getline(std::cin, str);
    return str;
}

これはまた、最大長について心配する必要がないことを意味し (少なくともこの時点では心配する必要はありません。他の場所で課したい他の制限があるかもしれません)、メモリ割り当ては自動的に管理されます。 .

于 2012-10-06T08:51:22.660 に答える
3

readString のスコープ内で文字列を作成します。戻ると、文字列は破棄されます。char *string = new char[20];この動作を回避したい場合は、関数に文字列を割り当てる必要があります。

于 2012-10-06T08:31:51.037 に答える