C/C++文字列変数の宣言方式の違い

1523 ワード

C/C++文字列変数の宣言方式の違い
一般的な文字列宣言形式は、*char str 1[16]、char str 1、char str[]
この3つの声明の形式にはどのような違いがあるのか、以下で実験を行います.
コードは次のとおりです.
#include 
using namespace std;

char *StrLab1();
char *StrLab2();
char *StrLab3();

int main()
{
	char *p1 = StrLab1();
	char *p2 = StrLab2();
	char *p3 = StrLab3();
	cout << "p1 = " << p1 << endl;
	cout << "p2 = " << p2 << endl;
	cout << "p3 = " << p3 << endl;
}
char *StrLab1() {
    char str1[16] = "I am str1";    //    ,   -----       ,    ,"I am str1"   
    char *p1 = str1;
    cout << p1 << endl;
    return p1;
}
char *StrLab2() {
    char *str2 = "I am str2";       //     ---------       ,     ,"I am str2"  
    char *p2 = str2;
    cout << p2 << endl;
    return p2;
}
char *StrLab3() {
    char str3[] = "I am str3";      //    ,   -----       ,    ,"I am str3"   
    char *p3 = str3;
    cout << p3 << endl;
    return p3;
}

実験結果:
I am str1
I am str2
I am str3
p1 = ╔
p2 = I am str2
p3 =

Process finished with exit code 0

結論
形式1:char str 1[16]
char str1[16] = “I am str1”; 自動変数、スタック内で、関数が戻った後、メモリが解放され、「I am str 1」は存在しません.
形式2:char*str 2
char *str2 = “I am str2”; 定数ストレージ領域は、関数が返されると、コードセグメントに「I am str 2」が存在します.
形式3:char str 3[]
char str3[] = “I am str3”; 自動変数、スタック内で、関数が戻った後、メモリが解放され、「I am str 3」は存在しません.