C语言中的const和free用法详解
注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候。如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件。因为,两个编译器会有差别的。
一、C语言中的const比较常见的用法,const做常量
#include<stdio.h> #include<malloc.h> #include<string.h> /* C中的const用法(使用VS测试的时候,要注意建立一个C后缀的文件,因为C的编译器和C++的编译器还是有区别的) */ //const用作常量,int const a和const int a是一个意思都是表示常量,可以通过指针来改变常量的值 void test1(){ const int a = 10; int* p = &a; *p = 20; printf("p:%d\n",*p); printf("a:%d\n",a); }
通过上面的例子,我们可以发现在C语言中,当使用const作为常量的时候,其实我们是可以通过指针,进行间接赋值从而改变常量的值。如果,上面的例子是在C++编译器中,int* p = &a,这句话会在编译的时候报错,当然你可以通过强转int* p = (int*)&a,强转之后指针p还是无法间接改变常量的值,这一点我也觉得很奇怪,明明指针p指向的是常量a,但是却无法改变a的值,打印的时候会出现两个不同的值。有网友说,那是因为汇编代码中a就代表10,也就是说,在汇编代码中a是直接用10代替了。
二、C语言中的const作为指针使用的时候
//const用法作为指针,const char* a,表示a是一个指向常量的一个指针,即常量的内容不能改变,但是指针a(a的值并不是a指向的常量)可以改变 // char* const a就表示a是一个指针常量,即内容可以改变,但是指针a不能改变 void test2(){ const char* a = NULL; a = "ABCD";//编译通过,运行不会报错,因为这里改变的是指针a,这里改变的并不是常量。这句代码会为字符串"ABCD"在全局区中开辟一块空间, //然后把字符串的首地址赋值给a //*a = 'a';//编译报错,因为内容是不可以修改的 char* const b = NULL; *b = "abcde";//编译通过,因为内容可以修改 //b = "aab";//编译报错,因为指针变量是一个常量,不能被修改 const char* const c = "abcd";//内容和指针变量都不能被修改 }
C语言中的细节是非常多的,所以一定要注意一下这些细节,如果想学好C语言一定要了解C语言的内存四区,考虑问题的时候从内存四区的角度去思考问题。
三、下面再介绍一个关于C语言中free函数的使用
/* c语言中free 1、C语言中的free是用来释放内存空间的,释放的是指针所指向的内存空间,释放完之后记得将指针赋NULL,避免出现野指针 2、在C语言中使用free方法的时候要特别注意,如果没有释放好可能会导致宕机,原因是有的内存空间是不能被释放的,如常量区 */ void testp1(){ //给指针开辟空间的时候,要养成一个良好的习惯 //声明指针的时候,记得赋NULL char* p1 = NULL; p1 = (char*)malloc(10);//p1中的内存是在堆中开辟的 p1 = "abcdef"; printf("p1:%s\n",p1); //释放内存的时候,先要判断是否为NULL,释放完之后记得给指针赋NULL,避免野指针 if (p1 != NULL){ free(p1); //如果,不赋NULL,释放之后不小心再使用p1的时候就会宕机 //因为,指针p1所指向的内容已经被释放掉了,而p1并不为空,却指向了一个不能被这个程序使用的空间,所以导致了宕机,而p1就成了一个野指针 printf("p1:%d",p1);//这代码会导致宕机 p1 = NULL; } } //下面的程序也会导致宕机,因为,free不能释放常量区中的内存 void testp2(){ char* p2 = "abcdef";//"abcdef"字符串是存放在常量区中的 if (p2 != NULL){ free(p2); p2 = NULL; } }
free函数不能释放全局区的内存,也不能释放数组的空间,如(char a[2]={'a'}),都会导致宕机。
四、最后再介绍一下C语言中的数组比较容易犯的错误
void main(){ //编译报错,初始值设定项太多,因为,在c语言中编译器会自动添加\0表示结束符,所以实际上a的大小是6,但只定义了5个所以导致编译报错 char a[5] = {'a','b','c','d','e'}; //测试数组大小用sizeof(a)是表示数组的所占内存空间的大小5*sizeof(char) }
以上所述是小编给大家分享的C语言中的const和free用法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对我们网站的支持!
上一篇:C++/Php/Python/Shell 程序按行读取文件或者控制台的实现
栏 目:C语言
下一篇:C 语言常用方法技巧
本文标题:C语言中的const和free用法详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1668.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置