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就在栈区里面了,上面的操作就把这组常量的地址赋给了指针,当编译器知道两个字符串是一样的就开始抠门(优化)了,在存储到内存四区的时候把两个合成为一个 ,节约地址空间,同一个常量那不就是同一个地址了

【温故而知新】

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