3
const char* test(bool i)
{
    const char t[] = "aa\n";
    const char* p = "bbb\n";
    if(i)
        return p;
    return t;
}
int main(array<System::String ^> ^args)
{
     printf(test(true));
     printf(test(false));
     return 0;
}

それはある種の何かを返します:

 bbb
 %^&$^$%

test(false)がローカル変数へのポインターを返すことは明らかです。問題は、pもローカル変数であるということです。関数が戻った後、「bbb\n」のメモリがクリーンアップされない理由。constchar[]はconstchar*と同じように解釈されると思いましたが、見た目どおりではありません。

4

2 に答える 2

6

pローカル変数ですが、それが指すのはローカルではありません。コンパイル時の文字列定数です。関数からその定数のアドレスを返すことは合法です。

tコンパイル時の文字列定数が自動ストレージ領域にコピーされ、返されたポインタを逆参照すると未定義の動作が発生するため、は異なります。

于 2012-05-19T21:20:54.220 に答える
1

pはローカル変数であり、値で返しますが、メソッドに割り当てられた自動メモリではなく、読み取り専用メモリに存在する文字列リテラルを指します。

戻っtてそれを使用すると、実際に未定義の動作が発生します。

また、ポインタと配列を同等とは考えないでください。

于 2012-05-19T21:21:24.547 に答える