2

配列の存続期間について混乱してmynameいますが、ステートメントからはまだ生きていifますか?cとc ++で同じ答えが得られますか?

int main (int argc, char* argv[])
{
    char* host;

    if (1 == argc)
    {
/*code below is copied from a book*/
        char myname[256];
        gethostname(myname, 255);
        host = myname;
/*code above is copied from a book*/
    }

    else
    {
        /*        */
    }
    printf("%s\n",host);

    return 0;
}

編集:

コードスニペットはBegining Linux Programming 4th edition、第15章:ソケットという本からのものです。著者がそのような間違いを犯したことをお詫び申し上げます。しかし、このコードを除外すると、この本は良いと思います。

4

3 に答える 3

7

myname配列のライフタイム[;]はifステートメントからまだ生きていますか?

いいえ

Do we get the same answer in C and C++?

はい

それは醜い、悪いコードであり、UBを持っています、のために使用std::stringしますhost

于 2013-01-11T02:40:27.500 に答える
1

配列はのmyname終わりで破棄されifます。hostこの時点での印刷は正常に機能する可能性がありますが、破棄されたメモリへのポインタを使用しているため、未定義の動作です。その機能は実装に依存します(およびその他の要因)。

これは、CとC ++の両方で同一です(破棄=>未定義)

于 2013-01-11T02:41:03.783 に答える
0

そのブロックを離れると、ifの保証はありませんmyname[256]。コンパイラには、「それを存続させる」ために、をhost指すという事実を追跡するものは何もありません。myname

于 2013-01-11T02:41:28.890 に答える