在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为要回收的空间的首地址

猜你喜欢

转载自www.cnblogs.com/LinxiHuang/p/9245879.html