C语言基础面试题(二)
static 关键字的作用
static:静态类型,main函数结束它就结束
1.延长生命周期,存在全局区
2.限制作用域,声明static的变量只能在本文件中使用,不能使用extern导入到其他文件
3.只初始化一次,若没有初始化,自动初始化为0
C的内存管理
//开辟空间 malloc int *p = (int*)malloc(sizeof(int)); //释放空间 free(p);
以下代码会发生什么
//错误写法 void getmemory1(char *p){ p = (char*)malloc(100); } //正确写法 void getmemory1(char **p){ *p = (char*)malloc(100); //getmemory1(&str); } int main(){ char *str = NULL; getmemory1(str); //str是首地址 应该拿二级指针接收 return 0; }
内存泄漏
1.操作系统以为用户占着某块内存,但是用户已经丢掉了该内存的地址,失去了操作权。
2.malloc以后,没有free操作,如果有很多这样的操作就会造成内存泄漏。
3.p = malloc(100); p = NULL; 失去了控制权,直到程序结束。
内存溢出
1.内存不够用
2.开辟很大的数组空间int arr[4096][4096],栈对象初始化失败,尤其是在多线程应用中。
const与#define的区别
1.const是在编译、运行时起作用,#define是在预处理阶段
2.const会比#define更安全,const会做类型检查(const int a=10;),在C++中建议使用const关键字。
系统调用函数与普通函数
系统调用:
一种操作系统的接口,一般采用高级语言编写(C,C++)
1.用户态和内核态使用不同的堆栈,系统调用会从用户态切换到内核态
2.是操作系统的一个入口点
3.因为会从用户态->核心态,系统开销大
4.依赖于内核,不保证移植性
系统调用函数: fork kill open read write socket
C库函数: malloc printf scanf gets puts strcpy strcat
普通函数:
自己写的函数
1.自己写的,移植性好
2.开销小
Linux用户态和核心态的通信方式
1.系统调用
2.procfs(/proc) 进程文件系统
有一个/proc目录被挂载,往这个目录写东西,就相当于与内核通信
3.sysctl(/proc/sys)
man sysctl 可以看到它的功能和用法。主要用来修改内核的运行参数。procfs输出的大量只读数据,sysctl大部分是可写数据。
3.sysfs(/sys) 虚拟文件系统
sysfs将procfs文件中的设备和驱动信息独立出来,以"设备树"的方式呈现,设备树就是根目录下的文件。
sysfs从内核空间读取设备信息和驱动信息,还可以对设备和驱动进行配置
4.netlink 套接口
本质就是socket,比较常用。
死循环表示方式(3种)
while(1); for(;;); loop: goto loop;
设置一绝对地址为0x67a9的整型变量的值为0xaa66
int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa66;
程序的局部变量存储在(栈)中,全局变量存储于(静态存储区),动态申请数据存储于(堆中);
#嵌入式##C##面试#