栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言中的const和free用法详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言中的const和free用法详解

注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候。如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件。因为,两个编译器会有差别的。

一、C语言中的const比较常见的用法,const做常量

#include 
#include 
#include  
 
//const用作常量,int const a和const int a是一个意思都是表示常量,可以通过指针来改变常量的值 
void test1(){ 
  const int a = 10; 
  int* p = &a; 
  *p = 20; 
  printf("p:%dn",*p); 
  printf("a:%dn",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 
  / 
void testp1(){ 
  //给指针开辟空间的时候,要养成一个良好的习惯 
  //声明指针的时候,记得赋NULL 
  char* p1 = NULL; 
  p1 = (char*)malloc(10);//p1中的内存是在堆中开辟的 
  p1 = "abcdef"; 
  printf("p1:%sn",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语言中编译器会自动添加表示结束符,所以实际上a的大小是6,但只定义了5个所以导致编译报错 
  char a[5] = {'a','b','c','d','e'}; 
  //测试数组大小用sizeof(a)是表示数组的所占内存空间的大小5*sizeof(char) 
} 

以上所述是小编给大家分享的C语言中的const和free用法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/63752.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号