C语言内存分配,堆栈,静态变量,局部变量。

引言

在做一个小练习时,出现这样一个小错误。

void init(const int a[], const int len) {
        struct node *p = &head;
        for (int i = 0; i < len; ++i) {
            struct node new_node{};
            new_node.a = a[i];
            new_node.next = NULL;
            p->next = new_node;
            p = p->next;
        }
}

head为头节点,希望初始化链表。发现之后打印链表时,失败,第二个节点的值和预期不一样。

根据经验,是内存分配的问题。百度,得出结论。总结一下。

问题的原因在于函数内自定义的变量分配在栈中,由计算机管理,函数结束后空间释放。无法带出。解决方法是自己申请空间。

void init(const int a[], const int len) {
    struct node *p = &head;
    for (int i = 0; i < len; ++i) {
        p->next = new node{a[i],NULL};
        p = p->next;
    }
}

于是顺便了解下C语言的内存管理。下面是学习几位大神博客得出。

https://blog.csdn.net/jirryzhang/article/details/79518408

https://www.cnblogs.com/jiahuafu/p/8575044.html

内存区域

堆(不连续,地址管理):程序员管理

栈(连续):函数内定义的变量名(局部变量名) key

常数区:全局变量和局部变量的值 value

静态区:定义的全局变量和局部静态变量

代码区:二进制代码

内存释放

栈:编译器自动释放(生存周期结束后释放)(函数结束后释放)

堆:程序员释放 或 OS 释放

静态区:程序结束系统释放

常量区:程序结束系统释放

案例

main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

    int b; 栈 
    char s[] = "abc"; 栈 
    char *p2; 栈 
    char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
    static int c =0; 全局(静态)初始化区 
    p1 = (char *)malloc(10);  堆 
    p2 = (char *)malloc(20);  堆 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值