• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中的const,free用法详解

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

作者:sinat_29957455的博客 字体:[增加 减小] 来源:互联网 时间:2017-07-23

sinat_29957455的博客通过本文主要向大家介绍了C语言,const,free用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

注意: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)
}

 

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中的const,free用法详解
  • 可变参数函数
  • c计算闰年
  • C和C++的内存操作小贴士(一):const char*的内存释放问题
  • 最长公共子序列LCS C++实现
  • c语言strcmp函数实现
  • 数组作为函数参数、scanf初始化指针
  • c语言中指针大小以及使用初始化问题
  • c语言一级指针简单应用
  • c语言实现字符串中单词的反转

相关文章

  • 2017-05-28对比C语言中getc()函数和ungetc()函数的使用
  • 2017-05-28Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法
  • 2017-05-28C#复制和深度复制的实现方法
  • 2017-05-28有关C++头文件的包含顺序研究
  • 2017-05-28C++中与输入相关的istream类成员函数简介
  • 2017-05-28基于C++自动化编译工具的使用详解
  • 2017-05-28C/C++指针小结
  • 2017-05-28C语言将数组中元素的数排序输出的相关问题解决
  • 2017-05-28深入uCOS中全局变量的使用详解
  • 2017-05-28C++中 STL list详解及简单实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • char str[] 与 char *str的区别详细解析
    • 深入分析为Visual Assist设置快捷键的方法
    • 浅谈c++ vector和map的遍历和删除对象
    • C++不使用变量求字符串长度strlen函数的实现方法
    • 深入解读C++中的右值引用
    • C语言中用于产生随机数的函数使用方法总结
    • C++中fstream,ifstream及ofstream用法浅析
    • VisualStudio 使用Visual Leak Detector检查内存泄漏
    • 利用C/C++二进制读写png文件的方法示例
    • c语言将字符串中的小写字母转换成大写字母

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有