C语言面试题详解指针篇,不知道内存分几个区,不是合格的程序员

指针的使用,一直是c语言面试题中必考的部分,

因为指针本身使用的复杂性与普适性,所以考点非常多,而且也可以与其他知识相互结合,

因此我们将会使用五篇专题的篇幅来介绍指针。

分析下面的程序,指出程序中的错误:

# include <stdio.h>

int main( void)

{

char a;

char *str=&a;

strcpy(str,"hello");

printf("%s ",str);

return 0;

}

本题解析

没有正确为str分配内存空间,将会发生异常。

问题出在将一个字符串复制进一个字符变量指针所指地址。

虽然编译的时候没有报错,但是在运行过程中,因为越界访问了未被分配的内存,而导致段错误。

相关知识点

在处理与指针相关的问题时,首先需要搞明白的就是内存,因为指针操作的就是内存。

第一个,就是内存的分区。这也是经常会被考察的一个考点。

写出内存分为几大区域

对于这个问题,有几种不不同的说法。

有的说内存分为五大分区,有的说分为四大分区,我们先来先看五个分区的说法:

认为内存分为五大分区的人,通常会这样划分:

1、BSS段( bss segment )

通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的

书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确

也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始化的就是我们这里所说的未初始化。

既然都是0那么就没必要把每个0都存储起来,从而节省磁盘空间,这是BSS的主要作用)的一块内存区域。

BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

BSS节不不包含任何数据,只是简单的维护开始和结束的地址,即总大小。

以便内存区能在运行时分配并被有效地清零。BSS节在应用程序的二进制映象文件中并不存在,

即不占用磁盘空间而只在运行的时候占用内存空间 ,所以如果全局变量和静态变量未初始化那么其可执行文件要小很多。

2、数据段(data segment)

通常是指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。

数据段属于静态内存分配,可以分为只读数据段和读写数据段。

字符串常量等,但一般都是放在只读数据段中。

3、代码段(code segment/text segment)

通常是指用来存放程序执行代码的一块内存区域。

这部分区域的大小在程序运行前就已经确定,

并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。

在代码段中,也有可能包含一些只读的常数变量,例例如字符串常量等,但一般都是放在只读数据段中 。

4、堆(heap)

堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);

当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

5、栈 (stack)

栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}” 中定义

的变量(但不不包括static声明的变量,static意味着在数据段中存放变量)。

除此以外, 在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,

函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。

从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

而四大分区的说法,则这么认为:

1、堆区:

由程序员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是整个程序运

行期间。使用malloc或者new进行堆的申请,堆的总大小为机器器的虚拟内存的大小。

说明:new操作符本质上是使用了malloc进行内存的申请,new和malloc的区别如下:

(1)malloc是C语言中的函数,而new是C++中的操作符。

(2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。

(3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,

而且会自动调用类的构造函数。

2、栈区:

由系统进行内存的管理理。主要存放函数的参数以及局部变量。

在函数完成执行,系统自行释放栈区内存,不需要用户管理。

整个程序的栈区的大小可以在编译器器中由用户自行设定,

VS中默认的栈区大小为1M,可通过VS手动更改栈的大。

64bits的Linux默认栈大小为10MB,可通过ulimit-s临时修改。

3、静态存储区:

静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行

期间都存在,它主要存放静态变量、全局变量和常量。

注意:

(1)这里不区分初始化和未初始化的数据区,是因为静态存储区内的变量若不显示初始化,

则编译器会自动以默认的方式进行初始化,

即静态存储区内不存在未初始化的变量。

(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。

静态存储内的常变量是全局变量,与局部常变量不不同,

区别在于局部常变量存放于栈,实际可间接通过指针或者

引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。

(3)字符串常量存储在静态存储区的常量区,字符串常量的名称即为它本身,属于常变量。

(4)数据区的具体划分,有利利于我们对于变量类型的理理解。

不同类型的变量存放的区域不同。后面将以实例代码说明这四种数据区中具体对应的变量。

4、代码区:

存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

通过上面的不同说法,我们也可以看出,这两种说法本身没有优劣之分,

具体的内存划分也跟编译器有很大的关系,因此这两种说法都是可以接受的,

搞明白内存的分区之后,指针的使用才能够更更加的灵活

需要学习编程或者为了入行、转行学习编程的伙伴可以关注.工.众.号:【速学C语言】公众号回复“8” 领取全套200G免费C/C++学习资料、视频!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容