引言
在做一个小练习时,出现这样一个小错误。
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); 堆
}