0

以下のコードでは、f() が戻った後に tmp 文字配列が破棄されることを期待しているため、x はまったく出力されません。

ただし、以下の関数 x では main() で出力されますが、for ループは正しいものを出力しません。誰かがこの動作を説明できますか? これが出力です。

abcdefg a b c d e f g abcdefg ?

k Y i

#include <iostream>
using namespace std; 

char* x;  
void f() 
{
    char tmp[100]= "abcdefg";   
    x = tmp; 

    cout << x << endl; 
    for(int i=0; i < 7; i++) 
        cout << x[i] << endl; 
}

int main() 
{
    f();

    cout << x << endl; 
    for(int i=0; i < 7; i++) 
        cout << x[i] << endl; 
}
4

4 に答える 4

3

あなたがしていることは未定義の動作です。無傷である場合とそうでない場合があるメモリ位置を指すポインターがあります。これは悪いです。

実際に起こっているのは、 char buffer tmp が function のスタック フレームに配置されていることです。f()その関数がデータを返すと、スタックに残され、将来のスタック フレームによって上書きされます。

あなたが行ったことを行う正しい方法は単純です。

std::string f() {
     std::string str ("abcdefg");
     std::cout << str << '\n';
     return str;
}
int main() {
    std::string s=f();
    std::cout << s << '\n';
}
于 2013-02-15T15:23:50.060 に答える
1

未定義の動作を呼び出しています。f()スコープが閉じた後、ポインターは有効である場合と無効である場合があります。

于 2013-02-15T15:22:43.577 に答える
0

あなたのプログラムでは、スタックに割り当てられているスタックx上のアドレスで初期化されるグローバルポインタであると定義されています。char temp[100]関数fが戻ると、スタック ポインターがデクリメントされます。ただし、x正しい値を持たない同じメモリ位置を指し続けるため、誤った出力が観察されます。

于 2013-02-15T15:28:33.207 に答える
0

UB を呼び出しています。プログラムに割り当てられなくなったメモリにアクセスします。最初の印刷でうまくいくのは単なる運です。

于 2013-02-15T15:23:14.623 に答える