C語言--內存裏的數據

先上一段代碼:

char* getstr1()
{
    char *p1 = "abcdefgh";
    return p1;
}
char* getstr2()
{
    char*p2 = "abcdefg";
    return p2;
}
void main()
{
    char *p1 = NULL;
    char *p2 = NULL;
    p1 = getstr1();
    p2 = getstr2();
    printf("1:%s  \n2:%s\n\n", p1, p2);

    printf("1:%d  \n2:%d\n", p1, p2);//打印p1p2的值(地址數值)
    system("pause");
    return;
}

輸出結果:

嗯,沒毛病,    現在把char *p1 = "abcdefg";  ,即和p2一樣了,

再看結果:

咦,這是怎麼肥事,p1和p2的指針跑一塊去了?

由此,找到內存四區的概念:

內存四區:1、棧區 2、堆區 3、全局區 4、代碼區

那麼上面的問題就可以理解了;

字符串作爲一組常量在全局區裏面,p就在棧區裏面了,上面的操作就把這組常量的地址賦給了指針,當編譯器知道兩個字符串是一樣的就開始摳門(優化)了,在存儲到內存四區的時候把兩個合成爲一個 ,節約地址空間,同一個常量那不就是同一個地址了

【溫故而知新】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章