在终端下
q:退出手册
ctrl+c:结束进程
ctrl+d:选中一个,依次往下选中
./:当前路径
数组为什么从0开始,本质就是偏移量
只显示这一个警告。
1、下面使用-w选项(-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。)
gcc -w -o test_w_wall testwwall.c
不会显示任何警告,直接编译成功。
2、-Wall选项意思是编译后显示所有警告
gcc -Wall -o test_w_wall testwwall.c
数组与指针
数组在C语言里面是唯一一个可以越界访问的
例如:arr[5]={1,2,3,4,5};
arr[5]=10;
输出arr[5]为10.
如果第六个属于你的地址,那就没有问题,如果不是自己的地址,就是非法访问。
%s:遇到结束符或者换行符才代表结束
arr[5]="hello"没有换行符的话也是字符数组
ch2有一个结束符,所以不会访问到ch3 ,ch1只是字符数组,没有结束符
后面越界的输出内存本来存放的一些乱码
把数字当成ASCII值存进去了
32位系统:用32位对系统进行编号
一个地址差一个字节
i越界就会读到f的值,目前不会说是非法越界
野指针,也可能指向系统的重要数据,稍微修改可能造成不可预想的后果。
定义了没有初始化,就是野指针。
不可访问区间:指向空指针,安全,不会导致系统崩掉,但程序会崩掉
指向数组的指针,所以指针在加一的时候,相当于加了一个数组的距离
只涉及到指针的指向,没有涉及到运算,也就是说没有转换成3,只是强制性的f_p指向3.14,但是f里放的是3.14的二进制码,因为*f_p的f_p是一个整型,所以会按照整型的思路来分析这个二进制码
arr是数组名,代表着arr里面的首元素地址
而&arr代表数组的首地址
a表示首元素的地址,+10表示10个偏移量 ,a+10这个地址下,
被称为匿名数组,没有取地址,也没有用sizeof(),相当于H的地址,
变长数组不能被初始化
*parr,代表指针,int *说明指向的类型为int*,所以偏移加1的时候,偏移8个字节,到了c位置,偏移2的时候会越界,
内存管理
数据段:存放常量数据,搞一个双引号,里面写字符串,就放在数据段
栈:整型a,指针p就放在栈上面。
数据段相比栈就小很多
初始化代码由编译器写的
不可访问:NULL,空指针就指向这里
把这个存放到环境变量,这是栈空间里的第一个区域,
命令参数:把函数参数,命令行参数存进去
局部变量:函数大括号里面就是局部变量
是系统自动加进去
我们写的代码其实只是很小的一部分,更多的内存放初始化代码 (编译器自动加进去的)
栈空间,多一个函数多一组
可以打印所有信息
地址(内存)不会返回,但是值可以返回
放在数据段里,不会被回收,不同于栈空间
内存改小了,地址不变,后面多出来的都是野指针,后面的都被丢弃了,只是没清理没人使用
内存变大,原本的地址会释放,换成新的地址
另外申请的不会被修改
申请空间:
常用:malloc ,calloc
不常用:realloc
当函数运行时,会有新的栈空间出来,存放一些函数的局部变量,当函数退出时,局部变量,也就是栈空间就会被释放
我能只能操作堆空间的,生成和释放
栈空间:自动生成,自动释放
数组在栈空间会被释放,所以返回没用
修改:
就会放在数据段里
p的指针(地址)属于栈空间
printf属于堆空间
回调函数是我们自己改不了,第三方的
argc参数个数,参数里面每一个值
结构体大小占得字节在不同系统中字节不一样。
可移植的结构体类型
将结构体进行压实
联合体共用一个内存,所以初始地址一样
整个联合体大小取决于最大类型的大小
一般枚举用在Switch语句中,枚举必须写常量,case后面也设必须跟常量
编译器
翻译过来可能会出现多个.o
链接:相同地方整合一起,不同地方分开来
宏
太长需要换行,可以加\
字符可以但是字符串不行,字符就是整型,单字节整型,有对应的ASCII码值。
头文件
可以查找路径