1
#include<stdio.h>
#include<stdlib.h>
char* re()
{
    char *p = "hello";
    return p;      
}
int main()
{
    char* tem = re();
    printf("%s", tem);
    return 0;
}

私のコンパイラは Dev-C++ です。re の関数が完了すると、p のポインタが削除され、p が指していたスタック空間も削除されると思います。そのため、'tem' のポインターは、'p' が指すスタック空間にアクセスできません。私の意見では、このコードにはいくつかのバグが表示されます。しかし、なぜですか?

この問題は私を長い間ゆがめます。理由を教えていただければ、あなたの親切な心に感謝します。

4

2 に答える 2

5

pスタックスペースを指していません。文字列リテラルを指します"hello"。文字列リテラルはプログラム全体で有効であることが保証されているため、プログラムは問題ありません。

(Dev-C ++についてはわかりませんが、ほとんどのコンパイラでは、文字列リテラルはプログラムのロード時に読み取り専用メモリに割り当てられ、プログラムの最後までそこにとどまります)

編集:文字列がスタック上にあり、コードが本当にバグがある場合でも、言語保証の中で機能しないものはないことに注意してください。無効なメモリには、無効になる前に含まれていた値を含めることができます(必須ではありません)。

于 2012-06-13T11:51:45.330 に答える
0

文字列「hello」はスタックに割り当てられていません (ただし、char *pポインターは割り当てられています)。
これは定数値 (読み取り専用メモリ) であるため、「データ セグメント」にあります。
C FAQ から: http://c-faq.com/decl/strlitinit.html

于 2012-06-13T12:01:33.547 に答える