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