zoukankan      html  css  js  c++  java
  • 小狼,你家BOSS喊你面试啦!!!(二)

    1、内存分配的形式有哪些

    内存四区模型啊:栈、堆、全局区、代码区。

    栈:存局部变量、返回值、参数等

    堆:动态申请内存。存malloc或者new出的数据

    全局区:存全局变量、静态变量、常量等

    代码区:存放二进制代码

    BBS段(符号起始的区块):存放未初始化的全局数据和静态数据(静态内存分配)

    数据段:存放已经初始化的全局变量

    代码段:又称为文本段。存放代码的一块内存(类成员函数,全局函数,其他函数的代码)

    堆:动态分配的内存段。由new、malloc分配内存,由delete、free来释放内存

    栈:存放临时变量

    2、什么是内存泄漏

    占用的内存空间得不到释放,导致这块内存不可再被使用,这就叫内存泄漏

    一般讲的内存泄漏指堆内存泄漏,是指由于疏忽或者错误,失去了对改短内存的控制,因而造成了对内存的浪费。

    3、栈空间的最大值是多少

    windows下栈大小一般是设计好的,是2M左右

    linux下栈的大小默认是8M,可以更改,,,命令是ulimits -s

    堆内存是小于2GB的

    4、什么是缓冲区溢出

    缓冲区是一块有大小的内存区域,当填充的数据大小超过这块缓冲区,导致覆盖这块缓冲区后面的内容,这就叫缓冲区溢出

    5、sizeof是关键字吗?

    不是,是单目运算符,是一个函数。

    是数据类型的关键字,,就像int double 这样的,,,不是函数,,也不是操作符。。。。。

    6、strlen(“”)和sizeof(“”)分别等于多少

    strlen(“”)=0

    sizeof(“”)=1

    函数strlen()执行的是计数器工作。

    sizeof()是C的关键字。

    差别主要在:

    一、strlen只能用char * 做参数;sizeof可以是以类型为参数,也可以是函数做参数

    二、时期:sizeof是在编译期间就算出来的;strlen是在执行期间计算的

    三、sizeof数组名时。只考虑空间占用字节数,不考虑内容是什么;strlen数组名时,只关心数据存储内容,不关心空间大小和类型。

    a[]={20,10,30,7,39,41}

    sizeof(a)=24

    strlen(a)=6

    char p[]="hello"

    sizeof(p)=6

    strlen(p)=5   ==>所以要算字符串长度的话,可以用strlen

    7、对于结构体而言,为什么sizeof的返回的值一般大于期望值

    因为有字节对齐机制

    struct的sizeof是所有成员对齐后长度相加,union的sizeof是取最大的成员函数

    使用命令#pragma pack(n)编译器将按n字节对齐

    字节对齐(字节填充)==》程序优化,cpu访问速度变快

    8、指针进行强制类型转换后与地址进行加法运算,结果是什么?

    进行强制转换后应该是数值型,相当于偏移地址,与地址进行加法,结果还是一块内存的地址。

    当p=0x1000000 则p+0x200==?

    (Ulong)p + 0x200   ==>这是数值加法,,,结果自然是数值

    (char *)p + 0x200   ==>0x1000000 + 0x200*sizeof(char)   ==>结果类型是char*

    9、使用指针有什么好处

    使用指针作为参数传递,减少内存申请,减少不必要的复制工作,提高程序效率

    一、可以动态分配内存

    二、进行多个相似变量的一般访问   (这个不是在讲数组遍历???)

    三、为动态数据结构尤其是树和链表提供支持

    四、遍历数组

    五、可以按照引用传递函数参数,提高开发效率

    (感觉还不如我说的呢。。。。)

    10、引用还是指针

    题目没看懂,是说什么时候使用引用还是使用指针么?

    先说差别:

    一:从本质上讲,引用是变量别名,不能改变对象,生命周期内只能是这个对象的引用;指针是变量,存的是内存地址,可以改变指向的。

    二:作为参数传递时,也不同。传指针是传值方式,传入的是一个地址值,形参是栈上的局部变量。传值的特点就是被调用函数对形参的任何操作都是作为局部变量进行的,不会改变实参的值;传引用是传址方式,虽然形参也是栈上的局部变量,但是存放的是实参变量的地址,处理时被处理成间接寻址,即通过存放的地址访问主函数的实参。

    三:使用时,指针需要解引用,引用则不能。

    四:初始化:引用必须初始化,且只有一次;指针不一定非要初始化,而且可以改指向。

    五:如果返回动态分配的对象或内存,必须使用指针。

    11、指针和数组是否表示同意概念

    不是啊,指针是一个变量,存放的内容是一块内存的地址;数组是内存开辟的一块空间,元素按顺序存储在这段空间内,数组名就是指向这块内存的首地址的指针。

    区别在于:一、修改内容时,数组用[]下标索引,指针需要解除引用。二、所占字节数不同,数组有自己的容量,但指针sizeof只会是4字节。

    12、指针是否可以进行  >   <   >=    <=  == 运算吗?

    ==可以,判断这两个指针是否指向同一块内存。

    其他的比较起来没有意义啊,比如p1    p2     p1<p2    这是啥意思,p1地址小于p2地址??是吧

    只能是==或者!=    其他的都不可以

    13、指针与数字相加的结果是什么

    地址偏移,,最终得到的还是一个指向某块内存的指针

    p1类型char*   p2类型int*

    p1+5   ==》前进5个字节

    p2+5   ==》前进20个字节

    14、野指针和空指针

    什么叫做野指针呢?就是释放了这块内存,但指向这块内存的指针没能置NULL;

    空指针呢,就是指向NULL的指针

    指针在创建的时候记得初始化或者指向空(NULL),不要置之不理,否则就成了野指针

    15、C/C++中头文件中ifndef和define和endif的作用有哪些

    ifndef和endif是配对使用的,防止重复定义(声明冲突)

    防止头文件多次被包含

    也可以用命令#pragma once

    define是宏定义,是把函数出现的某些字符串替换成宏定义的

    16、头文件<>和“”的区别

    <>包含的头文件是C/C++标准的头文件     

    “”包含的头文件是用户自定义的头文件    

    搜索路径顺序不一样

    <>编译器先从标准库路径开始搜索

    “”编译器先从用户的工作路径开始搜索

    17、#define有哪些缺陷

    容易产生错误   #define a   x+y         

    int c = a*b;    ==>替换      c = x+y*b    而不是 c = (x+y)*b

    类型不安全,不做类型检查

    一:不做类型检查

    二:优先级不同产生误差

    三:会导致代码膨胀(文本替换,展开代码)

    18、如何使用#define声明一个常数,用以表示一年中有多少秒

    #define Year_to_Second (365*24*60*60)UL     ==》注意长整型

    19、含参数的宏与函数有什么区别

    不知道,,,一个是在预编译处理,,一个是在编译链接过程中使用?

    一:函数是先计算实参的值,然后带入形参;宏只是简单的字符替换而已

    二:宏展开使程序内容增长,函数调用不会

    三:宏展开不需要占用运行时间,而函数调用会占用运行时间

    20、宏定义平方运算#define SQR(X) X*X  对吗?

    不对。   #define SQR(X) (X)*(X)

    21、不能使用大于小于if语句,如何定义一个宏来比较两个数a、b的大小 

     #define Judge_max(a,b) ((a)-(b))==(abs((a)-(b)))?a:b

    22、如何判断一个变量是有符号的还是无符号的

    赋值为0,减1,输出。负数有符号,整数无符号

    一:取反(原数和取反之后的数都大于0,则是无符号数)

    二:改变符号位(移位操作)    ==》左移,低位补零    右移,整数从高位补零,负数从高位补1。

    23、#define Trace(S) (printf(“%s ”,#S),S)是什么意思

    打印S字符串

    (printf(“%s ”,#S),S)  ==》 解释成printf(“%s ”,“S”)

    24、不使用sizeof,如何求int所占用的字节数?

    int a[2]    int num=&a[0]-&a[1];应该用指针的吧

    思想是对的,就是利用指针。

    25、如何使用宏求结构体的内存偏移地址

    考字节对齐?

    26、枚举和define有什么不同

    枚举元素的值和define不同    时间

    时期是对的;枚举常量可以调试的,宏定义常量不可以被调试;枚举可以一次定义多个常量,宏定义一次一个。

    27、typedef和define

    不懂。。。

    这俩都是在替对象取一个别名

    不同之处在于:

    一:typedef有类型检查的功能

    二:作用域不同,typedef有自己的作用域

    三:对指针的操作不同

           如:#define INTPTR1 int*

                  typedef INTPTR2 int*

                  INTPTR1 p1,p2    ==》p1为指针   p2为int型

                  INTPTR2 p3,p4    ==》p3和p4都是指针

    28、C++中宏定义和内联函数有什么区别

    时间    宏定义是字符串替换   内联函数能加快函数调用

    区别之一就是时期,说对了,还有之一是宏定义没有类型检查,内联函数有类型检查

    29、定义常量那种更好?define还是const

    define是字符串替换,而且是在预编译期间完成,,const  是在内存开辟空间使其内容不可更改, 就占用内存消耗来看,,应该是define好些;但const更安全

    差别:一、define是文本替换,const常量是开辟了内存空间的。二、const常量有数据类型的,define是没有数据类型的

  • 相关阅读:
    如何用互联网的思维开一家有逼格的客栈?
    create和grant配合使用,对Mysql进行创建用户和对用户授权
    Nginx 403 forbidden原因及故障模拟重现(转载)
    企业级缓存系统varnish应用
    实现基于Haproxy+Keepalived负载均衡高可用架构
    企业级监控zabbix基础
    实现基于Keepalived主从高可用集群网站架构
    实现基于LVS负载均衡集群的电商网站架构
    实现基于lnmp的电子商务网站
    CentOS6编译LAMP基于FPM模式的应用wordpress
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/9388309.html
Copyright © 2011-2022 走看看