嵌入式八股 - C语言 二

11、字符串末位\0问题

定义字符串有多种方式,下面将具体说明:

1)末尾自动加上\0

char str1[] = "hello"; 
char str2[10] = "hello";
char *str3 = "hello";

2)末尾不自动加上\0

char str5[] = {'h', 'e', 'l', 'l', 'o'};

12、strlen 和 sizeof 作用和区别

strlen和sizeof都可以用来计算变量所占内存大小。

  • strlen专门用来计算字符串大小,且其长度不包括末尾的'\0',计算结果是字符串的有效字符长度。
  • 而sizeof可以计算任何数据类型变量所占内存大小,在计算字符串大小时其长度包括末尾的'\0',其计算结果是变量或类型占用的总内存字节数
char str2[10] = "hello";
// strlen计算结果为5
// sizeof计算结果为10

13、数组越界有什么危害?

  • 读取越界:获取无效数据(可能是随机值或其他变量数据),导致逻辑错误。
  • 写入越界:
  • 覆盖相邻变量 / 栈数据,破坏程序状态;
  • 覆盖函数返回地址(栈溢出),导致程序崩溃或执行恶意代码;
  • 破坏堆结构(动态数组越界),引发内存泄漏或崩溃。

注意:C/C++ 不检查数组越界,需手动保证访问合法性。

14、栈泄漏有什么危害

使用栈内存时,写入超出栈内存分配范围的数据,通常会导致程序崩溃或者产生不可预测的行为。

  • 程序崩溃:当栈溢出时,程序可能会崩溃,并且在错误日志中显示堆栈溢出的消息
  • 未定义行为:栈溢出可能会导致程序进入未定义状态,产生不可预测的行为,可能会导致程序错误、数据损坏等问题。

15、内存泄露是什么

内存泄露指在一个程序中申请动态内存而没有进行相应的释放,导致这部分内存无法被再次利用。

发生原因:

  • 分配后忘记释放。比如使用 mallocnew 分配了内存,但在内存使用完毕后没有使用对应的 free 或 delete 进行释放。
  • 指针被覆盖。在释放内存之前,指向这块内存的指针被重新赋值,指向了新的内存地址。这样,原始内存块的地址就丢失了,程序再也无法访问和释放它。
  • 异常或错误导致提前退出。如果程序因为发生异常、错误或接收到信号而提前终止,可能会跳过正常的内存释放代码,从而导致泄漏。

内存泄漏的危害:性能下降、程序崩溃、系统不稳定(本质上还是内存减少或者耗尽引起的问题)

16、指针数组与数组指针的区别

  • 数组指针本质还是指针,其是指向数组的指针。比如int (*p)[10]。
  • 指针数组本质还是数组,其每个元素都是指针,比如int *p[10]。

17、指针函数与函数指针的区别

  • 函数指针本质还是指针,其可以指向一个函数。其定义形式如下:
/* 函数指针定义形式 
 * 说明;返回值类型为int;有2个函数参数且皆为int型
 * 
 * 含义:其可以指向一个返回类型为int,且具有两个int类型的参数的函数
 */
int (*p)(int, int);

/******************* 示例如下 *******************/
int add(int a, int b) { return a + b; }
// 定义一个函数指针 p,指向 add 函数
int (*p)(int, int) = add; 
// 通过指针调用函数
int result = p(3, 4); 
// result 为 7

  • 指针函数本质是函数,其函数返回值是指针。其定义形式如下:
int *func(int, int);

18、数组名和指针区别和联系

区别:

  • 数组名表示数组第一个元素首地址,是一个地址常量;而指针则是指向地址,可以改变指向
  • 数组名不能进行自增自减操作;而指针则可以
  • 可以通过数组名直接获取数组数据,比如通过下标;而指针则需要解引用间接获取数据
  • 在声明时数组名时分配一块连续的内存空间;而使用指针可以仅分配存储地址的空间,指向的内存可动态分配

联系:

  • 在很多场景中,数组名会自动转换为一个指向其首元素的指针。

需要注意的是,将数组名和指针作为sizeof参数时,sizeof(数组名)计算的是数组大小,而sizeof(指针)计算的则是指针本身大小。

19、野指针是什么?

野指针指的是一个指向了无效、未知或不可访问内存地址的指针

野指针的产生通常有以下几种情况:

  • 声明指针时没有进行初始化
int *p; // 野指针
int *p = NULL; // 建议
  • 指针指向的内存被释放后没有进行重新初始化或者赋值

这种情况下指针的也被称为悬空指针!

int *p = (int*)malloc(sizeof(int));
*p = 5;
free(p);     // 内存被释放
// p 仍然指向原来的地址,但已是无效内存
*p = 10;     // 危险!访问已释放的内存

// 建议
free(p);   // 内存被释放
p = NULL;  // 再赋值为NULL

  • 指针指向了已销毁的局部变量
int* get_addr() {
    int num = 100;
    return # // 返回局部变量的地址
}
int *p = get_addr(); // p 指向的内存已无效
printf("%d", *p);    // 危险!读取到的值是随机的

  • 指针越界访问
int arr;
int *p = arr;
for(int i = 0; i <= 5; i++) { // 循环条件错误,导致越界
    *(p + i) = i;
}

如何有效规避野指针?

  • 初始化:在声明指针时,如果暂时没有明确的指向目标,务必将其初始化为 NULL
  • 释放后置空:在使用 free() 或 delete 释放内存后,立即将对应的指针赋值为 NULL
  • 访问前检查:在解引用指针(使用 *p)之前,先判断它是否为 NULL
  • 注意不返回局部变量地址:不要从函数中返回指向栈内存的指针。如果需要返回数据,应使用动态分配的内存或通过参数传递指针。
  • 如果是在 C++ 中,使用智能指针

20、引用头文件时””和<>方式有什么区别

使用<>方式时编译器会优先从系统目录里面寻找头文件;而使用””方式时编译器会先从当前源文件目录寻找头文件后续再去系统目录里面寻找头文件。

#include <>

系统目录

标准库、系统头文件、第三方库

#include " "

先当前源文件目录后系统目录

项目内部的自定义头文件

#嵌入式求职##嵌入式笔面经分享##嵌入式##数据人的面试交流地##我的求职进度条#
嵌入式面试八股汇总 文章被收录于专栏

涉及嵌入式全方面知识。根据个人学习以及面试所得,并且加上自己见解、理解记忆方法。

全部评论

相关推荐

04-16 17:40
已编辑
武汉大学 Java
bg9本,暑期投了大概二十家,只有五家约了面,xhs笔试没过,华为今天晚上笔试,蚂蚁笔试过了不约面,剩下应该都是简历挂了。昨天晚上网易二面,感觉面试官全程严肃感觉不到情绪,没介绍组内业务,还是我反问环节提问才大概介绍了一下。面试大概三十多分钟,说hr3-5个工作日给结果,感觉凉了。美团面完快一周了也没消息,估计是要横向挂了。字节二面约到明天下午,如果没过就又要从零开始了。已经四月中旬,大厂的hc估计也快招够了。感觉鼠鼠的得失欲太重了,明知道面试是一件很看运气的事,自己的水平也没达到大佬级别,但是还是对每次面试抱有很大的期望,特别想要拿到一个offer,不自觉的给了自己很大的压力。npy也指出过我的问题,但是鼠鼠还是忍不住的去期望,因为暑期实习找不到大厂,秋招就又落后一大截了。最近一个月午休都睡不着,一闭上眼就是面试问到问题不会,手撕撕不出来的场景。早上也连着三天七点多梦见面试面的不好被吓醒了。每次洗澡都发现掉了一堆头发。开始找暑期实习以来最大的感触就是学历只能当敲门砖,在约到面以后学历就没有任何作用了,能不能进下轮面还是看知识储备,思维能力,代码水平。鼠鼠只恨自己目标规划不清楚,大一大二没怎么刷算法题学开发,想保研又不坚定,去导师组里做做研究又做不下去(也可能是我对cv实在不感兴趣),加上一门3学分的公选因为网课忘刷绩点爆炸了(本来在保研边缘线上努努力还是有机会的),于是直接放弃了。去年十一月去导师公司里实习了一个月,然后又开始左右脑互搏,到底是考研还是考公还是找工作。一直到二月底才终于下定决心准备找工作,只是时间已经太匆忙。一晃眼大学的时光竟然已经快要结束了,虽然忙忙碌碌但也一事无成,后悔的事多到数不清。当然鼠鼠也知道相比于双非的同伴们的处境已经好太多了,但还是忍不住抒发一下内心的想法。最重要的还是看开吧,如果网易和字节都寄了,就继续投继续面,实在面不到中大厂就去银行,就去小厂,我相信总能找到一份实习的。祝各位牛友们运气爆棚,都能拿到自己满意的offer后续更新:网易互娱4.16上午hr面,当天下午oc,祝大家跟鼠鼠一样好运
Wannamai:照镜子了😭
我的求职进度条
点赞 评论 收藏
分享
csig&nbsp;腾讯云&nbsp;暑期一二面面经:一面&nbsp;50min实习经历括号对是否合法反问二面&nbsp;40min实现一个高并发高可用的消息队列来完成生产者消费者模型实习经历是的,你没看错。全程无八股。年前的字节、快手,到这次的藤子,一个八股都没问过。说实话有点不习惯,以前背得滚瓜烂熟的HashMap、线程池、JVM调优,一个都没用上。如果不涉密,我已经想开个班把实习经历卖出去了。目前的情况:腾讯、字节,两个应用部门都不问八股。下周准备挑战私募和创业厂,看看那边还背不背八股。---给正在准备面试的同学一点参考:1.&nbsp;八股不是没用,但优先级在下降大厂应用部门更看重你实际做过什么、能不能讲清楚项目中的决策和踩坑。背题能过简历关,但过不了面试关。2.&nbsp;实习经历是新的“八股”现在面试官喜欢问:“你当时为什么这么设计?”“有没有别的方案?”“如果流量翻十倍怎么办?”建议把实习中的每一个细节都准备好,尤其是矛盾点、取舍、复盘。3.&nbsp;不同公司、不同部门差别很大有的组还喜欢拷打基础,有的组全程聊项目。面之前可以多看看该部门的面经风向,别只背通用八股。4.&nbsp;如果遇到全程聊项目的面试官,恭喜你说明他真想看你能不能干活。这时候把项目讲得有逻辑、有数据、有反思,比背一百道题都管用。最后:不是八股彻底死了,而是面试正在变回“聊天”而不是“考试”。祝大家都能遇到聊得来的面试官。
查看3道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务