C语言面试基础(三)

Linux 系统内核体系结构

1.系统调用界面
2.进程管理
3.内存管理
4.虚拟文件系统
5.设备驱动
6.体系结构
7.接口

kernel(内核)的主要任务

管理进程
系统的调用
文件io(输入输出)的管理
借助设备驱动程序进行设备管理

使用malloc应该注意什么?

malloc动态分配内存空间,数据保存在堆区,返回这段空间的头指针。

int *p = (int *)malloc(32);
if(p == NULL){
    //p可能没有分配成功
    printf("内存分配失败\n");
}

//因为存储在堆区上,使用完要记得free
free(p);

sizeof

#include <stdio.h>

struct A{
    short a;
    int c[50];
    char b;
}*ptr;

int main(int argc, char *argv[])
{
    char arr[] = "";
    int *q;
    printf("%ld\n", sizeof(struct A));  //4 + 50*4 + 4 = 208
    //空结构体大小为0

    printf("size arr: %ld\n", sizeof(arr)); //有个'\0'
    printf("*prt: %ld\n", sizeof(ptr));     //64位 指针大小为8 32位是4
    printf("q size: %ld\n", sizeof(q));     //8
    return 0;
} 

c语言中头文件 <> 和 "" 的区别

尖括号一般是声明c标准库的,例如#include <stdio.h> 表示要从系统库文件里面找这个头文件。
双引号一般是自己定义的头文件,例如#include "myfun.h" 表示要从当前路径下搜索头文件,要是搜索不到,再去系统标准库路径下搜索。
区别就是搜索方式不同,#include "stdio.h"也可以搜索到,要是你把自己定义的头文件放进系统库环境里,也可以加尖括号。

C语言多文件编程

由一个或多个文件(.h)、函数模块文件(.c),然后再加上一个主函数入口文件(main.c)。
优点:

1.方便代码复用:模块化的代码可以方便迁移到其他项目中去。
2.方便分工合作:各个功能模块由多个文件同时编辑,提高工作效率。
3.方便后续维护:模块分得明确,维护起来也很好。
4.保证了库支持:自己编写头文件(*.h),可以实现快速编译和保护源码的效果

mylib.h

//防止头文件重复
#ifndef MYLIB_H
#define MYLIB_H
//导入要用的库文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//函数声明
void print_hello();

#endif

myfun.c

#include "mylib.h"

void print_hello(){
    printf("Hello world!\n");
}

main.c

#include "mylib.h"

int main(int argc, char *argv[])
{ 
    print_hello();
    return 0;
} 

注意:main.c 和 myfun.c 都要包含头文件 mylib.h
linux下gcc编译: gcc *.c 生成a.out可执行程序 ./a.out运行

C语言是如何编译成可执行文件的

预处理:处理掉注释,将所有宏展开替换 生成.i文件,此时还是文本文件
gcc -E main.c -o main.i //将文件main.c预处理成main.i文件
编译:检查代码的语法结构,语法错误,生成汇编文件,此时里面是汇编代码的文本文件
gcc -S main.c -o main.s //汇编处理源文件,生成main.s文件
汇编:将汇编代码翻译成系统的机器码,生成
.o文件
gcc -c main.s -o main.o //将汇编文件就行汇编处理,生成二进制文件(比较重要)
链接:将生成的二进制文件与可依赖的库函数就行链接操作,生成目标可执行文件
gcc main.o fun.o -o a.out //将目标文件连接生成可执行文件

Linux Makefile的使用

经常用于项目中,方便编译,并且能编译效率比自己输入命令要快,makefile只编译改动过的文件,大大提高了效率,在大型项目中尤为明显。

a.out: main.o myfun.o
    gcc main.o myfun.o
main.o:
    gcc main.c -o main.o -c
myfun.o:
    gcc myfun.c -o myfun.o -c
clean:
    $(RM) *.o a.out

目标a.out 需要依赖main.o myfun.o 执行的命令时gcc main.o myfun.o
目标main.o怎么生成? gcc main.c -o main.o -c (-o表示生成的文件名 -c生成.o文件)
目标myfun.o怎么生成? gcc myfun.c -o myfun.o -c
直接使用命令: make 就能一键完成所有文件的编译
clean 可以使用make clean命令,清除编译痕迹(*.o a.out可执行文件), $(RM) 就是rm -f的写法,相当于
rm -f *.o a.out

#面试##嵌入式##c##Linux#
全部评论
学习C语言的面试基础
点赞 回复 分享
发布于 2022-10-16 17:45 河南

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
评论
6
26
分享
牛客网
牛客企业服务