堆栈-操作系统(二)

接上文。

这篇文章没有涉及到最根本的原理,只是浅谈。毕竟只是记问之学,没有深入研究过,做此章供大家参考。


上文我们提到了栈和堆存放不同类型的变量,但是有部分问题仍未解决。这篇文章将简说内存分配的其他空间。

代码段:存放代码的空间,这里的代码指的是二进制代码。比如你写了一个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),他是存储不了数据的。

当然也可能是我没有想到解决方法,不知道大家还有什么方法在栈中创建链表?

请留言。