程序的内存空间
进程对应的内存空间中所包含的5种不同的数据区:
BSS段:BSS段(bss segment)通常是指⽤来存放程序中未初始化的全局变量的⼀块内存区域。BSS是英⽂Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:数据段(data segment)通常是指⽤来存放程序中已初始化的全局变量的⼀块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指⽤来存放程序执⾏代码的⼀块内存区域。这部分区域的⼤⼩在程序运⾏前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含⼀些只读的常数变量,例如字符串常量等。
堆(heap):堆是⽤于存放进程运⾏中被动态分配的内存段,它的⼤⼩并不固定,可动态扩张或缩减。当进程调⽤malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利⽤free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈⼜称堆栈,是⽤户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调⽤时,其参
数也会被压⼊发起调⽤的进程栈中,并且待到调⽤结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别⽅便⽤来保存/恢复调⽤现场。从这个意义上讲,我们可以把堆栈看成⼀个寄存、交换临时数据的内存区。
molloc函数以前⽼是为了防⽌变量重名,喜欢在函数⾥设置局部变量,感觉没啥区别,但是刷题时在main函数中定义⼤容量的数组时,程序有时就会报错,改成全局变量时就好了。
数组定义在函数中会占⽤栈空间,⽽往往栈空间⽐较⼩,所以⼤数组定义在函数中会出现内存⽅⾯的问题。
但是如果将数组定义为全局变量则分配在数据段,则不存在所谓的内存问题!
所以遇到⼤容量数组,尽量还是定义为全局变量更好
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论