网上书店网站建设毕业设计顺徳网站建设公司有哪些
web/
2025/9/26 11:04:29/
文章来源:
网上书店网站建设毕业设计,顺徳网站建设公司有哪些,高要建设网站,内蒙古呼和浩特邮编#x1f4dc;作者#xff1a;不想脱发的基兄 #x1f4fa;专栏#xff1a;《嵌入式面试》 #x1f4e3;格言#xff1a;不管前方的路有多苦#xff0c;只要走的方向正确#xff0c;不管多么崎岖不平#xff0c;都比站在原地更接近幸福。 前言#xff1a; 2022年秋招我… 作者不想脱发的基兄 专栏《嵌入式面试》 格言不管前方的路有多苦只要走的方向正确不管多么崎岖不平都比站在原地更接近幸福。 前言 2022年秋招我面试嵌入式MCU开发方向经过了多场的笔试与面试在准备的过程中看了非常多的资料我的汇总的笔记一直写在有道云笔记中没有分享出来。现在已经到了23年春招了特此整理后分享出来。资料看过了觉得不错就保存下来了如果有不对的地方欢迎批评指正侵权联删 1、递归函数定义没有问题递归深层次后易引发什么问题 1影响执行效率 2栈溢出。 因为每一次调用函数是栈区都要给函数分配空间而且上一次调用并没有结束调用的次数太多栈区的内存不够分配了便会出现栈溢出的情况。 2、堆与栈的区别 1栈的空间是系统自动分配和回收堆的空间是用户手动分配回收malloccallocreallocfree 2栈的空间较小堆的空间较大 3栈的地址空间往地址向下增长堆的地址空间是由低地址到高地址 4栈的存储效率更高 3、循环控制条件关键字goto被经常使用但是goto的使用场合为什么受到局限 因为goto会破坏程序的栈逻辑。 4、循环控制条件关键字goto的使用场景有哪些 1常用来跳出死循坏 2打印错误 3goto被经常使用只是使用场合受到局限因为他会破坏程序的栈逻辑。 5、字节对齐的理解 5.1 什么是字节对齐 字节对齐主要是针对结构体而言的通常编译器会自动对其成员变量进行对齐以提高数据存取的效率 5.2 字节对齐的两种方式 默认对齐方式、指定对齐方式 1)默认对齐方式内存分配满足以下三个条件 结构体第一个成员的地址和结构体的首地址相同 结构体每个成员地址相对于结构体首地址的偏移量offset是该成员大小的整数倍如果不是则编译器会在成员之间添加填充字节 结构体总的大小要是其成员中最大size的整数倍如果不是编译器会在其末尾添加填充字节。 如char是1字节short是2字节int是4字节... 2指定对齐方式使用以下方式声明 //注通过#pragma pack(n)改变C编译器的字节对齐方式
#pragma pack(4) //安装4字节的对齐方式 指定对齐方式内存分配满足以下几个条件 结构体第一个成员的地址和结构体的首地址相同 结构体每个成员的地址偏移需要满足N大于等于该成员的大小那么该成员的地址偏移需满足默认对齐方式地址偏移是其成员大小的整数倍小于该成员的大小那么该成员的地址偏移是N的整数倍。 结构体总的大小需要时N的整数倍如果不是需要在结构体的末尾进行填充。 如果N大于结构体成员中最大成员的大小则N不起作用仍然按照默认方式对齐。 注在使用#pragma pack设定对齐方式一定要是2的整数幂也就是124816…不然不起作用的仍然按照默认方式对齐。 例1结构体使用字节对齐为1
// date:2022年 11月 08日 星期二 19:35:36 CST
// author: HeiBaiYe
// path: /mnt/hgfs/CD2206/02-c语言
#include stdio.h#pragma pack(1) //通过#pragma pack(n)改变C编译器的字节对齐方式 在C语言中结构是一种复合数据类型
struct s1{char ch; // 1int a; //4double b; //8char c1; //1
};#pragma pack(1)
struct s2{char ch; //1int a; //4double b; //8
};int main()
{printf(s1的大小%ld\n ,sizeof(struct s1));printf(s2的大小%ld\n ,sizeof(struct s2));return 0;
}结果 s1的大小14 s2的大小13 例2结构体使用默认字节对齐方式m值 // date:2022年 11月 08日 星期二 19:35:36 CST
// author: HeiBaiYe
// path: /mnt/hgfs/CD2206/02-c语言
#include stdio.h
struct s1{char ch; // 1int a; //4double b; //8char c1; //1
};struct s2{char ch; //1int a; //4double b; //8
};int main()
{printf(s1的大小%ld\n ,sizeof(struct s1));printf(s2的大小%ld\n ,sizeof(struct s2));return 0;
} 结果 s1的大小24 s1的大小16 参考链接https://blog.csdn.net/wdl20170204/article/details/109386825 6、局部变量和全局变量可以重名吗 1能局部变量会屏蔽全局变量。C中要用全局变量需要使用 ::(域解析符) 。C语言中局部变量可以与全局变量同名在函数内引用这个变量时会用到同名的局部变量而不会用到全局变量。 2对于有些编译器而言在同一个函数内可以定义多个同名的局部变量比如在两个循环体内都定义一个同名的局部变量而那个局部变量的作用域就在那个循环体内。 7、UNIX系统中fsync函数的作用 fsync()负责将参数fd 所指的文件数据, 由系统缓冲区写回磁盘, 以确保数据同步。 头文件#include 定义函数int fsync(int fd); 函数说明fsync()负责将参数fd 所指的文件数据, 由系统缓冲区写回磁盘, 以确保数据同步. 返回值成功则返回0, 失败返回-1, errno 为错误代码。 参考链接:https://blog.csdn.net/Michaelwubo/article/details/41210547 8、const关键字使用有哪些 8.1 修饰变量 const的 常规用法在变量初次定义时赋初并用关键字const修饰使变量只可访问不能重新赋值修改变量。 8.2 修饰指针 1限制指针变量修饰指针变量指向的位置不能被修改。定义时被 const 修饰的指针变量指针只能在定义时初始化不能定义之后重新指向新的数据。 2限制指针变量指向的数据修饰【指针的解引用】修饰的指针变量指向的变量的值不能被修改但是该指针可以指向其它空间。 3同时限制指针变量和指针变量指向的变量的值修饰指针变量指向的位置不能被修改并且指针变量指向变量的值也不能被修改。 4修饰函数形参【指针】函数形参可以利用const关键字进行限制来防止在函数内部修改指针指向的数据。 9、内存布局中有哪些段 文本段(.text)、数据段(.data)、.bss段、堆(heap)、栈(stack) 图 虚拟空间的各个部分 10、volatile关键字的作用 1裸机编程时某变量是指向寄存器中某一特定地址添加volatile的变量不进行优化处理 2某函数与中断函数共享全局变量时加上volatile让编译器不要省略该变量的访问 3多线程中修饰共享全局变量让编译器不要省略该变量的访问。 11、sizeof()与strlen()的区别 1sizeof是运算符计算能容纳实现所建立的最大对象的字节大小参数可以是数组、指针、类型、对象、函数等 2strlen是函数功能是返回字符串的长度参数必须是字符型指针char*。 12、内存泄漏和内存溢出是什么 1内存溢出指程序申请内存时没有足够的内存供申请者使用。或者说给了你一块存储int类型数据的存储空间但是你却存储long类型的数据那么结果就是内存不够用此时就会报错Out Of Memory,即所谓的内存溢出。 2内存泄漏是指程序在申请内存后无法释放已申请的内存空间。一次内存泄漏似乎不会有大的影响但内存泄漏堆积后的后果就是内存溢出。 13、定义一个指针赋值字符串与定义一个数组赋值字符串有什么区别 1指针赋值字符串是指向一定内存的指针只不过是指向字符串常量的指针指针中的数据不能修改。 2数组赋值字符串是一片char型的数组可以理解为缓冲区只不过是赋值为了字符串。 14、malloc()与calloc分配空间有什么不一样 1malloc申请后空间的值是随机的并没有进行初始化而calloc却在申请后对空间逐一进行初始化并设置值为0 2malloc要申请的空间大小需要我们手动的去计算calloc并不需要人为的计算空间的大小。 15、实现循环的方式 while、for 、do while 、goto 循环。 16、全局变量和局部变量在内存中有什么不同? 1全局变量保存在内存的全局存储区中占用静态的存储单元 2局部变量保存在栈中只有在所在函数被调用时才动态地为变量分配存储单元。 17、预处理的作用是什么 预处理器可以删除注释、包含其他文件以及执行宏宏macro是一段重复文字的简短描写替代。 18、编译器的作用 编译器就是将一种语言通常为高级语言翻译为另一种语言通常为低级语言的程序。一个现代编译器的主要工作流程源代码(.c)→ 预处理器(.i) → 编译器 (.s)→ 目标代码 (.o)→ 链接器 → 可执行程序 。 19、.ELF文件是什么 .ELF是C语言在linux中的可执行文件。 20、C语言程序编译的流程是什么 图 编译过程 1预处理根据以字符#开头的命令修给原始的C程序结果得到另一个C程序通常以.i作为文件扩展名。主要是进行文本替换、宏展开、删除注释这类简单工作。 对应的命令linux gcc -E hello.c hello.i 2编译编译器将文本文件hello.i翻译成hello.s包含相应的汇编语言程序。 对应的命令linux gcc -S hello.c hello.s 3汇编将.s文件翻译成机器语言指令把这些指令打包成一种叫做可重定位目标程序的格式并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程)。 把一个源程序翻译成目标程序的工作过程分为五个阶段词法分析语法分析语义检查和中间代码生成代码优化目标代码生成。主要是进行词法分析和语法分析又称为源程序分析分析过程中发现有语法错误给出提示信息。 对应的命令linux gcc -c hello.c hello.o 4链接将静态库和动态库的库函数连接到可执行程序中。静态库是指编译链接时把库文件的代码全部加入到可执行文件中因此生成的文件比较大但在运行时也就不再需要库文件了。其后缀名一般为.a。动态库与之相反在编译链接时并没有把库文件的代码加入到可执行文件中而是在程序执行时由运行时链接文件加载库这样可以节省系统的开销。动态库一般后缀名为.sogcc在编译时默认使用动态库。 原文链接https://blog.csdn.net/daide2012/article/details/73065204 21、如何用C语言实现C的类 1由于C语言是面向过程而C是面向对象所以在定义数据时可以用C的结构体成员充当C类的成员定义 2由于结构体只能定义变量不能够定义函数所以通过函数指针的方法来实现其类函数的定义。 参考链接https://blog.csdn.net/forever__1234/article/details/61429870 结语 C语言是嵌入式的基础像我总结的这些面试题都是去年我去面试好几家公司所遇到的常见面试题。因此在面试找工作的那段时间归纳总结常遇到过的面试题并将不会的知识点进行检索归纳是很必要的。这样做的话可以提升自己的知识面面试时就能从容面对不同面试官各种不同的问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82161.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!