• 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
    ",*p);
    	printf("a:%d
    ",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
    ",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语言中的数组比較easy犯的错误

    void main(){
    	//编译报错。初始值设定项太多,由于,在c语言中编译器会自己主动加入表示结束符,所以实际上a的大小是6,但仅仅定义了5个所以导致编译报错
    	char a[5] = {'a','b','c','d','e'};
    	//測试数组大小用sizeof(a)是表示数组的所占内存空间的大小5*sizeof(char)
    }




  • 相关阅读:
    JS获取今天的日期
    领域模型vs数据模型,应该怎么用?
    如何让技术想法更容易被理解?
    如何做好技术 Team Leader
    回归分析中常见的“门槛模型”!
    有了数据湖,距离数据仓库消失还有几年?
    数据治理 VS 公司治理、IT治理、数仓治理
    Sentence-seven basic patterns 英语句子结构
    VM的Linux CentOS系统的VMTools的手动安装
    linux下IPTABLES配置详解
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7384208.html
Copyright © 2020-2023  润新知