linux编译c成ko,在linux上编译C
1. 写好源代码后,使⽤gcc编译器来编译
通过函数来查所需包含的头⽂件
man 2/3 函数名 // man 2 ⼀般⽤于查linux系统⾥的函数
// man 3 是C通⽤的函数
通过头⽂件来查头⽂件⾥声明的函数
man 头⽂件名 // 如 man stdio.h
gcc test.c //编译test.c⾥的代码,默认⽣成可执⾏⽂件 a.out
gcc test.c -o myexe //指编译⽣成的可执⾏⽂件名为myexe
执⾏: ./myexe 或者 路径/myexe
2. 计算机中的内存.
⼀个程序需要执⾏起来,需要把整个程序镜像(可执⾏⽂件)加载到内存上。 ⽽且执⾏中的程序中的变量也需在内存⾥分配空间
程序: 就是编译出来的可执⾏⽂件
进程: 处于执⾏状态的程序叫进程, ⼀个程序可以有多个进程
在代码⾥:
int aaa; //意味着需要在内存⾥划分出4字节空间⽤于存放变量aaa的值, 划分出来的空间的地址就是&aaa.
⼀个程序镜像,会成好多个段,其中有⼏个段是我们要了解的:
反汇编可执⾏⽂件: objdump -D 可执⾏⽂件
objdump -D 可执⾏⽂件 | less
在函数体内声明出来的变量,它的作⽤域只能在此函数体⾥,这种变量叫局部变量
在函数体外声明出来的变量,它的作⽤域是整个程序, 这种变量叫全局变量
静态变量,如果是在函数内部声明,它的作⽤域只能在此函数内部,只会初始化⼀次.
静态变量如果是在函数外部声明的,它的作⽤域只能在此源⽂件⾥.
代码段(.text): 在程序中某个位置开始的区域专门存放代码⽣成的机器指令. 我们写的代码编译完成后,都是放在代码段
数据段(.data): 存放已初始化的全局变量与静态变量. 数据段所需的空间在编译时就会分配出来.
只读数据段(.rodata): 存放只读的数据. 只读数据所需的空间也是在编译时就会由编译器分配出来的
未初始化数据段(.bss): 没有初始化的全局变量与静态变量(赋0值也是不算初始化). bss段所需的空间在编译时没有分配,直到程序加载到内存时,系统才会给进程分配出来
栈:是系统划分出来的⼀个区域, 是所有进程共⽤的空间,专⽤于局部变量空间的分配. 每个进程在栈都只能使⽤限定的⼤⼩空间(不能超过12M, 超出会发出段错误). 栈是从⾼地址往低地址分配空间的
堆: 也是系统划分出来的⼀个区域,⽤于所有进程动态申请的空间.每个进程申请的空间⼤⼩没有限制,只要系统还有空闲的内存就可以.堆是从低地址往⾼地址分配空间的
局部变量: 只有在代码执⾏时才会分配空间, 局部变量在栈⾥分配空间, 在所属的函数执⾏结束时回收空间.C语⾔⾥在堆动态申请空间,使⽤malloc()函数。动态申请出来的空间不再使⽤时,应使⽤free()函数回收.
"&" 取地址符号, "&变量名"
"*指针变量名" : 取指针变量存放的地址上存放的值
指针也是变量中的⼀种, ⽤于存放其它变量的地址或动态申请出来的空间的⾸地址. 指针本⾝也需要占⽤内存空间, 也就是有占⽤内存地址int num = 99; //在内存上分4字节空间,空间的⾸地址为&num, 此空间上存放的值为99
int *p = # //声明⼀个指针变量p, p存放的值就是变量num的地址
&p : 取指针变量本⾝的地址
p : 取指针变量存放的值,也就是存放的其它变量的地址指针变量本身有地址吗
*p : 取指针变量存放的地址(&num)上⾯存放的值(num)
void *malloc(size_t size); //在堆⾥申请size字节空间⼤⼩
返回值类型为: void *(通⽤类型的地址,⽤任何类型的指针变量都可以接收返回值).
返回值为申请出来的空间的⾸地址
void free(void *ptr); //释放申请出来的内存, ptr为要回收的空间的⾸地址

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。