C++ static相关问题总结

这篇博客深入探讨了C++中的内存管理,包括栈、堆和静态变量的使用。通过实例展示了如何声明和访问这些不同类型的变量。同时,文章还讨论了类的静态成员函数,解释了它们的作用和用法,以及单例模式的应用。在代码示例中,展示了静态成员函数如何在不同情境下工作,并分析了它们的内存分配和生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前程序堆,栈和static,指针分析

typedef struct JXPalmUser{
        
        uint8_t* pv;
        char name[255]; 

}User;

int main(void){
        User user;
        printf("User addr :%d\n",user);
        printf("User.name addr: %d\n",user.name);
        static User sUser;
        printf("static User addr: %d\n",sUser);
        printf("static User.name addr: %d\n",sUser.name);

        int32_t i = 10;
        printf("proc addr: %d\n",&i);
        User* pUser = (User*)malloc(sizeof(User));
        printf("malloc ptr User addr: %d\n",pUser);
        printf("malloc ptr User.name addr: %d\n",pUser->name);
        static User* spUser = (User*)malloc(sizeof(User)*1);
        printf("malloc static ptr User addr: %d\n",spUser);
        printf("malloc static prt USer->name addr: %d\n",spUser->name);

        return 0;
}

输出

User addr :1288599656
User.name addr: 1288599400
static User addr: 6296008
static User.name addr: 6295752
proc addr: 1288599380
malloc ptr User addr: 22253584
malloc ptr User.name addr: 22253592
malloc static ptr User addr: 22253856
malloc static prt USer->name addr: 22253864

#include <iostream>


class A
{
public:
    int index;
    std::string name;
    static A& getInstance();
    static void show_sta(std::string name);
    void show_nonSta(std::string name);
    A();
};
A::A()
{
    index =1;
    name = "xjh";
}
void A::show_sta(std::string name)
{
    std::cout<<name<<" say:I am static."<<std::endl;
}
void A::show_nonSta(std::string name)
{
    std::cout<<name<<" say: I am non static."<<std::endl;
}
A& A::getInstance()
{
    static A a;
    return a;
}
void func()
{
    std::cout<<"using func"<<std::endl;
}
void func2()
{
    std::cout<<"usning func2"<<std::endl;
}


int main(int argc, char *argv[])
{
    std::cout<<"start"<<std::endl;


    {

        //create instance
        A& a_getIns = A::getInstance();
        a_getIns.show_sta("a_getIns");
        a_getIns.show_nonSta("a_getIns");
        std::cout<<"a_getIns.index:"<<a_getIns.index<<std::endl;
        std::cout<<"a_getIns.name:"<<a_getIns.name<<std::endl;

        A& aa_getIns = A::getInstance();
        A::show_sta("A::show_sta");
        aa_getIns.show_nonSta("A::can not use show_nonSta");
        std::cout<<"aa_getIns.index:"<<aa_getIns.index<<std::endl;
        std::cout<<"aa_getIns.name:"<<aa_getIns.name<<std::endl;

        //change prop
        a_getIns.index = 2;
        a_getIns.name = "abc";
        std::cout<<"aa_getIns.index:"<<aa_getIns.index<<std::endl;
        std::cout<<"aa_getIns.name:"<<aa_getIns.name<<std::endl;
        aa_getIns.index = 22;
        aa_getIns.name="aa_getInsbbcc";
        std::cout<<"aa_getIns.index:"<<a_getIns.index<<std::endl;
        std::cout<<"aa_getIns.name:"<<a_getIns.name<<std::endl;

        //create by normal, new, static
        A b_nonSta;
        b_nonSta.show_nonSta("b_nonSta");
        b_nonSta.show_sta("b_nonSta");

        A* c_new = new A();
        c_new->show_nonSta("b_nonSta");
        c_new->show_sta("b_nonSta");

        A d_static;
        d_static.show_nonSta("b_nonSta");
        d_static.show_sta("b_nonSta");

        func();
        func2();
        delete c_new;

    }

    std::cout<<"end"<<std::endl;

}

进入code block前

在block中

 

block结束

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值