1.指针的大小是固定的,和指针的类型没有关系
只与编译器有关,32位系统指针大小为8个字节,x64一般为64位系统,指针大小一般为4个字节。
2.sizeof()和strlen()
sizeof()计算所占内存的大小,可以计算int float大小
strlen()计算的是字符串长度,不会计算字符串末尾添加的'\0';
字符串以'\0'结尾,\0是不需要计算长度的strlen('\0') = 0的, sizeof("\0") = 2
3.c语言内存分配的方式
1.静态存储区分配,定义全局变量,静态变量
2.栈上分配 局部变量定义在栈中
3.堆上分配 动态变量定义在堆中(malloc, new)
4.结构体和联合体的区别
union和struct的区别
union联合体:成员共享一块地址
共用体大小 = 成员中占内存最大的成员大小
struct结构体:不同的成员放在不同地址中。
结构体大小 = 所有成员大小之和(字节对齐) 根据编译环境判断是四字节对齐还是八字节对齐
5.宏,写一个宏返回输入参数比较小的一个
#define MIN(a,b) ((a) > (b) ? (b) : (a))
6.#include <> 和#include“”
<>是在标准库路径搜索,
“”会从用户工作路径搜索,对于自己定义的文件,""会比较快
6.全局变量和局部变量区别
1.作用域,全局变量作用域为程序块,局部变量的作用域是函数内部
2.生命周期:全局变量 ,局部变量生命周期是当前函数
3,存储方式,局部变量存在栈里面,全局变量存在全局数据区中
7.内存泄漏和内存对齐
在程序运行时候,动态分配的空间没有被回收或是正确释放,导致这个内存空间还占用着系统资源,这个就叫内存泄漏
内存对齐:在存储数据时,将数据按照一定的规则放置在内存中的过程
结构体中
8.堆和栈的区别
1.创建方式不同,栈是系统自动创建,(主要用于保存局部变量,函数执行完成,栈被销毁),堆是程序员手动进行创建和释放的,malloc进行创建,free进行释放,
2,栈当使用完后,自动销毁,堆是由程序员手动销毁
9,malloc和new
malloc是c语言标准库函数(分配内存后返回void*)类型指针,使用malloc分配内存时候需要指定分配内存大小,
使用new进行内存分配返回对应对象类型的指针,使用new进行内存分配不需要指定,使用malloc分配内存的时候不会调用构造函数,使用new分配内存的时候会调用构造函数
10.SPI有几根线
spi有四根线, SCLK:时钟线, MOSI:主设备输出,MISO,主设备输入,从设备输出, CS:片选线, //不需要进行双向通信,MOSI,MISO其中一根线去除 //CS:只进行一对一通信的时候
11.TCP和UDP区别
TCP是可靠连接可靠传输,三次握手 TCP是面向连接的通信方式
UDP是无连接不可靠通信 UDP是不需要连接
UDP比TCP传输速率块,有可能会丢包 UDP:视频,在线游戏,直播
12.SPI和IIC的寻找区别
SPI(4根线,MISO,MOSI,SCLK,CS片选引脚)寻址:CS片选引脚拉低,选择对应的设备进行通信
IIC寻址方式:(SDA,SCL) 通过从机地址来进行寻址(7位,10位从机地址)
13.什么是交叉编译
交叉编译指的是在一个平台上编译出另外一个平台的可执行程序
ARM开发板.c .h不能拷贝ARM开发板,ubuntu使用交叉编译链,.c->可执行程序
14.UART, IIC和SPI区别
UART采用异步通信,没有时钟线,IIC和SPI采用同步通信,有时钟线
IIC起始信号,SDA和SCL是高电平,SDA拉低,SCL再拉低。
IIC停止信号,SDA和SCL是低电平,首先SCL拉高,SDA拉高。
15.僵尸进程,孤儿进程
使用fork()创建子进程后,如果子进程退出,父进程没有调用wait()或者waitpid()回收子进程占用的资源, 需要调用