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##面试#
全部评论
C语言基础面试题
1 回复 分享
发布于 2022-10-20 15:25 河南

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
评论
2
19
分享
牛客网
牛客企业服务