接上文。
这篇文章没有涉及到最根本的原理,只是浅谈。毕竟只是记问之学,没有深入研究过,做此章供大家参考。
上文我们提到了栈和堆存放不同类型的变量,但是有部分问题仍未解决。这篇文章将简说内存分配的其他空间。
代码段:存放代码的空间,这里的代码指的是二进制代码。比如你写了一个hello world的程序,总得有一个地方存放这段程序,而普通c语言代码存放在磁盘中,可是经过编译链接后的代码存放在哪?就是这个代码段中。而代码段中的数据只可读不可写。
BSS(Block Started by Symbol): 用于存放程序中未初始化的全局变量和静态变量的一块内存区域。可读可写。而未初始化的全局变量在编译前会被编译器自动置零。
数据段: 已初始化的全局变量和静态变量存于其中,属于静态内存分配。
所以,上文的变量中:
#include<iostream>
using namespace std;
int a; //未初始化的全局变量,存于BSS
int b = 0; //已初始化的全局变量,存于数据段
int main(){
static int c; //未初始化的静态变量,存于BSS
static int d = 1;//已初始化的静态变量,存于数据段
const int e = 2; //局部const依然存储在栈中
return 0;
}
如果说const在函数体之外呢?简单,const在函数体之外属于全局变量,存在于数据段中。
以上是基础。
但是!问题来了:根据上述内容,我们在构造链表的时候,需要new一个节点,然后将链连起来,那么整个链表存放在哪里呢?
这个问题是腾讯面试官大大问我的题,当时一听题脑子就懵掉了,这是个什么问题???当然我是一步一步懵掉的,后来回想,腾讯大大问题的意思就是这个,当然在面试的时候我没理解,自然没答出来。
这个问题其实也不难,只要知道链表这个数据结构代表什么就好。
这是一个最简单的单链表。下面写一个创建链表的伪代码(为了解决这个问题简化后的伪代码,逻辑有问题):
node* create_list()
{
int x=0;
node *temp = NULL;
while(x != -1)
{
cin>>x;
p = new node;
p->data = x;
if(x == -1)
{
break;
}
temp->next = p;
temp = p;
}
return head;
}
由上文我们知道,node* p = new node;这里的p是指针,存放在栈区,而new node存放在堆区,也就是说:
当然,head是头结点,可以存储在栈区,也可以存储在数据段。
上图我们可以看到,这个链表存储在堆区,好的,接下来问题又来了。
面试官:链表可否存储在栈区呢?
我:emmmmm。
接着分析:转换一下面试官的意思,就是能不能不用new创造新的节点,这样在函数体内的链表就是栈区了。
答案显然是不能的。创造一个节点类型的变量,却不给这个变量存储空间(没有new node),他是存储不了数据的。
当然也可能是我没有想到解决方法,不知道大家还有什么方法在栈中创建链表?
请留言。