zoukankan      html  css  js  c++  java
  • 内存四区:代码区、数据区、栈区、堆区

    本文转载于:https://www.cnblogs.com/kelamoyujuzhen/p/11069620.html

    代码演示常量区

    复制代码
    #include<iostream>
    using namespace std;
     
    const char* getstr1()
    {
        const char* str1 = "hello";
        return str1;
    }
    
    const char* getstr2()
    {
        const char* str2 = "hello";
        return str2;
    }
    int main(int argc, char* argv[])
    {
        const char* p = getstr1();
        const char* q = getstr2();
        cout << "p=" << p << "  " << "addr=" << static_cast<const void*>(p)<<endl;
        cout << "q=" << q << "  " << "addr=" << static_cast<const void*>(q)<<endl;
    
        return 0;
    }
    复制代码

    代码演示栈区

    复制代码
    #include<iostream>
    using namespace std;
    
    char* getstr1()
    {
        char str1[] = "hello";
        return str1;
    }
    
    char* getstr2()
    {
        char str2[] = "hello";
        return str2;
    }
    int main(int argc, char* argv[])
    {
        char* p = getstr1();
        char* q = getstr2();
        cout << "p=" << p << "  " << "addr=" << static_cast<const void*>(p) << endl;
        cout << "q=" << q << "  " << "addr=" << static_cast<const void*>(q) << endl;
    
        return 0;
    }
    复制代码

    p,q指向内容乱码很好理解,但是p q 的指向的地址是一样的,这是因为“hello”在.rdata区。还有一种情况,char *p = "hello"; hello也在.rdata区。二者区别如下

    char str[] = "hello"  这里面str不是指针,他是数组,所以不会像指针一样存在指向问题。编译器会把常量区的串 “hello”拷贝到对应栈帧。

    把p q本身的地址打印出来

    发现p q在main对应的栈帧中的确占了2个内存空间。但奇怪的是怎么p q 指向的内存一样呢?其实这里的一样完全是巧合,因为getstr1 getstr2实现完全一样,导致"hello"这个串在栈帧的位置也是一样的。

     一般在函数调用的时候,会根据调用规则 有不同压栈规则,这就是说函数内定义的东西是局部于栈帧的。所以str1 和str2 是两个栈帧里面的东西。
    稍微改变一下getstr2,p q 的地址就不一样了

    参考:剖析.o文件ELF组成

    代码演示堆区

    复制代码
    #include<iostream>
    #include<cstring>
    using namespace std;
    
    char* getstr1()
    {
        char* str = (char*)malloc(sizeof(char) * 6);
        char buf[] = "hello";
        strcpy_s(str,6, buf);
        return str;
    }
    
    char* getstr2()
    {
        char* str = (char*)malloc(sizeof(char) * 6);
        char buf[] = "hello";
        strcpy_s(str,6, buf);
        return str;
    }
    int main(int argc, char* argv[])
    {
        char* p = getstr1();
        char* q = getstr2();
        cout << "p=" << p << "  " << "addr=" << static_cast<const void*>(p) << endl;
        cout << "q=" << q << "  " << "addr=" << static_cast<const void*>(q) << endl;
    
        return 0;
    }
    复制代码

  • 相关阅读:
    linux下互相传文件的快捷方法
    c语言学习笔记.内存管理.
    c语言学习笔记.结构体.
    格雷码
    c语言学习笔记.指针.
    c语言学习笔记.数组.
    c语言学习笔记.关键字.存储类型关键字等
    leetcode.C.4. Median of Two Sorted Arrays
    Verilog笔记.6.FIFO
    Verilog笔记.5.同步、异步
  • 原文地址:https://www.cnblogs.com/double-W/p/12571372.html
Copyright © 2011-2022 走看看