嵌入式软件工程师面试题——2025校招社招通用(C/C++)(三十八)

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!

目录

1.字节对齐问题

2.C语言函数参数压栈顺序是怎样的

3.在1G内存的计算机中能否malloc(1.2G)?为什么?

4.malloc、calloc、realloc内存申请函数

5.什么是指针?什么是指针的类型?

6.指针本身所占据的内存区

7.指针和数组的区别?(类型、赋值、内存、字节大小、修改内容)

8.什么是野指针?如何产生?如何避免?

9.什么是智能指针

10.智能指针的内存泄漏问题是如何解决的?

11.数组名num /&num的区别

12.有了指针为什么还需要引用


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.什么是野指针?如何产生?如何避免?

答案:

野指针:是指指针指向的地址是不确定的;

原因:释放内存之后,指针没有及时置空;

避免:

  1. 初始化置NULL
  2. 申请内存后判空
  3. 指针释放后置NULL
  4. 使用智能指针

9.什么是智能指针

答案:

智能指针是个类,用来存储指针(指向动态分配对象的指针)。

C++程序中使用堆内存是非常频繁的,堆内存的申请和释放由程序员手动管理,这很容易造成堆内存的泄漏,使用智能指针能更好的管理堆内存。

10.智能指针的内存泄漏问题是如何解决的?

答案:

为了解决循环引用导致的内存泄漏,引入了weak_ptr。

11.数组名num /&num的区别

答案:

对于一维数组来说

num+1是偏移到下个元素,&num+1是偏移整个数组

对于二维数组来说

num+1是偏移一个一维数组,&num+1是整个数组

12.有了指针为什么还需要引用

答案:

直接的原因是为了支持运算符重载。

用指针的使用经常犯得错

1. 操作空指针,

2. 操作野指针,

3. 不知不觉改变了指针的值,而后还以为该指针正常。如果我们要正确的使用指针,我们不得不人为地保证这三个条件。而引用的提出就解决了这个问题。

引用区别于指针的特性是 :

1. 不存在空引用(保证不操作空指针);

2. 必须初始化(保证不是野指针);

3. 一个引用永远指向他初始化的那个对象(保证指针值不变)

  • 40
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值