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语言中的数组比較easy犯的错误

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




转载于:https://www.cnblogs.com/jzssuanfa/p/7305666.html

<think>我们正在讨论C语言标准库中的stdlib.h,用户想要了解它的使用方法。根据引用内容,我们可以知道stdlib.h提供了内存管理、字符串转换、随机数生成、排序等功能。首先,内存管理函数是stdlib.h中非常重要的部分,包括malloc、calloc、realloc和free。引用[2]和引用[5]详细介绍了calloc函数的使用,它分配内存并初始化为零。引用[3]展示了malloc的用法,它分配内存但不初始化。引用[5]还提到了realloc用于重新分配内存大小。其次,引用[4]提到了一些转换函数,如atof、atoi、atol和strtod,它们用于将字符串转换为数值。另外,引用[4]还介绍了qsort函数,用于对数组进行排序;abs和labs用于取绝对值;rand和srand用于生成随机数。接下来,我们将按照功能分类介绍stdlib.h中常用函数的使用方法,并给出示例代码(参考引用中的代码片段)。注意:用户要求使用中文回答,并且按照指令中的格式要求(行内公式用$...$,独立公式用$$...$$,但我们这里主要是代码和文字描述,数学公式较少)。结构:1.内存管理函数2.字符串转换函数3.随机数生成函数4.排序函数(qsort)5.其他实用函数(如abs等)每个部分给出函数原型、功能说明和示例代码。同时,根据指令要求,生成相关问题。由于引用内容已经提供了一些示例,我们将整合这些示例并补充必要的说明。</think> ### C语言 `stdlib.h` 库使用方法详解 `stdlib.h`(标准库头文件)是C语言核心库之一,提供内存管理、类型转换、随机数生成等功能。以下是关键函数分类及用法: --- #### 一、内存管理函数 1. **`malloc`** - **功能**:动态分配指定字节的内存 - **注意****不初始化内存内容**(值为随机) - **原型**:`void* malloc(size_t size);` - **示例**(分配整型内存): ```c int *p = (int*)malloc(sizeof(int)); if (p == NULL) exit(1); // 检查分配是否成功 *p = 10; free(p); // 必须释放! ``` [^3] 2. **`calloc`** - **功能**:分配并**初始化内存为零** - **原型**:`void* calloc(size_t num, size_t size);` - **示例**(分配数组): ```c int *arr = (int*)calloc(5, sizeof(int)); // 分配5个int for(int i=0; i<5; i++) printf("%d ", arr[i]); // 输出: 0 0 0 0 0 free(arr); ``` [^2][^5] 3. **`realloc`** - **功能**:调整已分配内存的大小 - **原型**:`void* realloc(void* ptr, size_t new_size);` - **示例**: ```c int *arr = (int*)malloc(5 * sizeof(int)); arr = (int*)realloc(arr, 10 * sizeof(int)); // 扩容到10个元素 free(arr); ``` [^5] 4. **`free`** - **功能**:释放动态分配的内存 - **必须与** `malloc/calloc/realloc` **配对使用**,否则内存泄漏[^2][^3] --- #### 二、字符串转换函数 1. **`atoi` / `atof` / `atol`** - **功能**:字符串转数值(int/float/long) - **原型**: ```c int atoi(const char* str); double atof(const char* str); long atol(const char* str); ``` - **示例**: ```c printf("%d", atoi("123")); // 输出123 printf("%f", atof("3.14")); // 输出3.140000 ``` [^4] 2. **`strtod`** - **功能**:更安全的字符串转双精度浮点数 - **可检测无效字符** - **示例**: ```c char *end; double val = strtod("3.14abc", &end); printf("数值: %f, 无效后缀: %s", val, end); // 输出: 数值:3.140000, 无效后缀:abc ``` [^4] --- #### 三、随机数生成 1. **`rand`** - **功能**:生成伪随机数(范围:`0` ~ `RAND_MAX`) - **原型**:`int rand(void);` - **需先播种种子**(否则每次运行结果相同) 2. **`srand`** - **功能**:设置随机数种子 - **常用时间做种子**:`srand(time(NULL));` - **示例**: ```c #include <time.h> srand((unsigned)time(NULL)); int r = rand() % 100; // 生成0-99的随机数 ``` --- #### 四、排序与工具函数 1. **`qsort`** - **功能**:快速排序数组 - **原型**: ```c void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void*, const void*)); ``` - **示例**(排序整型数组): ```c int compare(const void* a, const void* b) { return (*(int*)a - *(int*)b); // 升序 } int arr[] = {5, 2, 8, 1}; qsort(arr, 4, sizeof(int), compare); // 结果: {1,2,5,8} ``` [^4] 2. **`abs` / `labs`** - **功能**:取绝对值(int/long) - **原型**: ```c int abs(int x); long labs(long x); ``` - **示例**:`printf("%d", abs(-10)); // 输出10`[^4] --- #### ✏️ 使用要点总结 1. **内存管理三原则**: - 检查返回值是否为 `NULL`(分配失败) - 成对使用 `malloc/calloc` 和 `free` - 释放后指针置空:`free(p); p = NULL;` 2. **随机数**:必须先用 `srand` 播种 3. **`qsort` 关键**:需自定义比较函数,返回值规则: - $a > b$ → 正数 - $a = b$ → 0 - $a < b$ → 负数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值