说明:
- 面试群,群号: 228447240
- 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
- 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
- 博主与大家一起学习,一起刷题,共同进步;
- 写文不易,麻烦给个三连!!!
前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!
1.字节对齐问题
答案:
什么是字节对齐:
需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐;常见就是求复合类型大小,比如结构体、联合体。
为什么需要字节对齐
需要字节对齐的根本原因在于CPU访问数据的效率问题。
2.C语言函数参数压栈顺序是怎样的
答案:
从右往左,并且内存中栈是由高向低扩展,所以先入栈的是右边并且地址是高位。
比如printf()函数,也都是先打印最右边。
3.在1G内存的计算机中能否malloc(1.2G)?为什么?
答案:
有可能,因为malloc是相进程申请虚拟内存,与物理地址空间没有直接关系。
4.malloc、calloc、realloc内存申请函数
答案:
申请堆内存
void *malloc(size_t size); //申请size_t个字节内存
void free(void *ptr); //释放内存,但是指针还是可以用
void *calloc(size_t nmemb, size_t size); //申请nmemb快内存,每块size_t个字节
void *realloc(void *ptr, size_t size);//申请内存,重新申请size_t字节内存
void *reallocarray(void *ptr, size_t nmemb, size_t size); //重新分配内存块
说明:
1. malloc 内存未初始化,如果size为0,则malloc()返回NULL或一个稍后可以成功传递给free 的唯一指针值。
2. realloc 如果size_t>原来的s申请的空间大小,比如原来是100个字节,现在是150个字节,那么就有以下两种情况:
- 原来100个字节后面还能放的下50个字节,那么就在原来地址上增加50个字节,返回的还是原来地址
- 如果100个字节后面放不下50个字节,那么就会重新找个地址开辟150个字节空间,把原来的地址数据拷贝过来,释放掉原来地址空间,返回一个新的地址
3.calloc 申请内存空间后,会自动初始化内存空间为 0。
5.什么是指针?什么是指针的类型?
答案:
指针其实也是个变量,只不过这个变量里面存储的是内存地址。
举例说明:
int * a;指针类型为int *
char *c;指针类型为char *
6.指针本身所占据的内存区
答案:
占用内存的大小,在32为系统中无论是什么类型的指针都是4个字节。64位为8个字节。
7.指针和数组的区别?(类型、赋值、内存、字节大小、修改内容)
答案:
1.概念
数组:是同种类型的集合
指针:里面保存的地址的值
2.赋值:
同种类型指针之间可以直接赋值,数组只能一个个元素赋值
3.存储方式:
数组是连续的一段空间,指针的存储空间是不确定的
4.修改内容不同
比如:
char p[] =”hello”,我们可以执行p[0] = ‘s’操作原因是p是数组,可以使用下标的方式进行修改数组内容
Char * p = “hello” 执行p[0] = ‘s’是错误的,原因是p是指针,指向字符串常量,常量是不允许修改的
5.所占字节不同
指针永远是4个字节在32为系统中,而数组是不固定的,要看数组的类型和元素个数
8.什么是野指针?如何产生?如何避免?
答案:
野指针:是指指针指向的地址是不确定的;
原因:释放内存之后,指针没有及时置空;
避免:
- 初始化置NULL
- 申请内存后判空
- 指针释放后置NULL
- 使用智能指针
9.什么是智能指针
答案:
智能指针是个类,用来存储指针(指向动态分配对象的指针)。
C++程序中使用堆内存是非常频繁的,堆内存的申请和释放由程序员手动管理,这很容易造成堆内存的泄漏,使用智能指针能更好的管理堆内存。
10.智能指针的内存泄漏问题是如何解决的?
答案:
为了解决循环引用导致的内存泄漏,引入了weak_ptr。
11.数组名num /&num的区别
答案:
对于一维数组来说
num+1是偏移到下个元素,&num+1是偏移整个数组
对于二维数组来说
num+1是偏移一个一维数组,&num+1是整个数组
12.有了指针为什么还需要引用
答案:
直接的原因是为了支持运算符重载。
用指针的使用经常犯得错:
1. 操作空指针,
2. 操作野指针,
3. 不知不觉改变了指针的值,而后还以为该指针正常。如果我们要正确的使用指针,我们不得不人为地保证这三个条件。而引用的提出就解决了这个问题。
引用区别于指针的特性是 :
1. 不存在空引用(保证不操作空指针);
2. 必须初始化(保证不是野指针);
3. 一个引用永远指向他初始化的那个对象(保证指针值不变)