C语言学习 c基础1

vim的常用操作:

简单使用:vim filename.c、i 编辑、Esc、ZZ
模式切换:
    正常 插入 i
    插入 正常 Esc/Ctrl+C
    正常 行底 :
    行底 正常 Esc/Ctrl+C
正常模式的操作:
    光标移动:hjkl、n+Enter、n+G、gg、G
    删除内容:x、dw/de、dd/ndd、p/P
    复制内容:yy/nyy、p/P
    撤销操作:u、U、Ctrl+R
    进入插入模式:a/A、i/I、o/O
插入模式的操作:
    Ctrl+P、Ctrl+C、Ctrl+X
行底模式的操作:
    set nu/set nonu、%s/old/new  

编译器:

编译器负责把人类能看的懂的代码,翻译成计算机能看懂的二进制指令。
gcc、g++是GNU社区为了编译Linux内核代码而开发一款编译框架,能支持众多编程语言。
常用的参数:

-Wall 显示所有警告
-Werror 把警告当作错误处理,不会产生可执行程序
-o 设置编译结果的名字
-E 预处理
-s 编译生成汇编代码
-c 汇编生成目标文件
-I 指定头文件的路径
-l 额外需要链接的库
-L 库文件的路径
-g 编译时添加调试信息

C

C语言文件类型:

.h 头文件
.gch 头文件的编译结果
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件(动态库)

C代码变成可执行程序的过程:

预处理:
    gcc -E file.c 预处理结果显示屏幕
    gcc -E file.c -o file.i 预处理结果保存到文件
编译:
    gcc -s file.i 把C代码编译成汇编代码,会生成.s结尾的汇编文件
汇编:
    gcc -c file.s 把汇编文件编译成二进制代码,会生成.o结尾的目标文件
链接:
    gcc a.o b.o c.o 把若干个目标文件合并成可执行文件,默认生成a.out
    gcc a.o b.o c.o -o xxx 设置可执行文件的名字

C语言32个关键字:

数据类型有关:

    内建类型:void unsigned signed char short int long float double
    自定义类型:struct union enum typedef
    类型限定:auto const static volatile register extern
    字节数计算:sizeof 

流程控制有关:

    分支:if else 
    开关:switch case break default
    循环:for while do
    跳转:goto continue return

变量的分类:

变量的属性:存储位置 生命周期 作用域
全局变量:
    data 初始化过的,bss 未初始化的 
    整个程序的运行时期
    任何位置都可以使用,其它源文件中需要声明
静态全局变量
    data 初始化过的,bss 未初始化的 
    整个程序的运行时期
    在目标文件内可以使用
局部变量
    stack
    函数开始执行到结束
    函数内
静态局部变量
    data 初始化过的,bss 未初始化的
    整个程序的运行时期
    函数内

进程的内存分布:

text 代码段:存储的是二进制指令、常量(字符串字面值),该内存段的权限为只读,一旦强行修改就会产生段错误。
data 全局数据段:里面存储着初始化过的全局变量、静态变量。
bss 静态数据段:里面存储着末初始化过的全局变量、静态变量,该内存段在程序执行前会被初始化为0。
heap 堆:由于程序员手动管理,该内存无法与标识符建立映射关系(无法取名字),必须与指针配合使用。
    优点:够大,分配和释放可控。
    缺点:使用麻烦,容易产生内存泄漏、内存碎片。
stack 栈:由系统自动管理,随着函数被调用,会自动分配内存,函数执行结束后自动释放内存。
    优点:使用方便,采用栈结构方式管理安全,不会产生内存泄漏、内存碎片。
    缺点:大小有限,一次使用过多可能会产生段错误,分配和释放不可控,不适合长期保存数据。

几个关键字:

auto 早期用于定义临时变量(局部变量和块),C11标准中它可以用于定义自动推导类型的变量。

const 限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。

static	 
	指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值
	也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

volatile 
	使用volatile声明变量值的时候,告诉编译器不对此变量进行优化,总是从系统读取该值
	即volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

register 用于定义存储在寄存器中而不是 RAM 中的局部变量

extern
	用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
	当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。

typedef 为类型取一个新的名字,此后引用新名字就可以引用此类型

使用gdb配合core文件调试段错误

当程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方,而Ubuntu系统默认是不输出core文件的,需要执行ulimit -c unlimited,我们把这命令添加到~/.bashrc,并重新加载 source ~/.bashrc,就可以长期有效了。

1、编译程序时添加调试信息:
gcc -g file.c
2、执行带调试信息的程序,重新产生core文件。
./a.out
注意:在中文路径下无法产生core文件。
3、使用gdb调用程序
gdb a.out 
4、在gdb中运行程序
(gdb)run
5、退出gdb
(gdb)q
Quit anyway? (y or n)y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值