目录
深入理解指针操作、动态内存分配与释放是C语言编程中的核心技能。以下内容将进一步详细阐述这些主题,旨在帮助开发者更好地掌握指针的使用以及如何安全、有效地管理程序中的动态内存。
一 深入理解指针操作
A.指针的基本概念
-
指针变量:指针变量是一个存储内存地址的变量。在声明时,需要指定指针的类型,如
int *p;
表示p
是一个指向整型变量的指针。指针变量的值就是它所指向的内存地址。 -
指针的初始化:指针变量在使用前必须被初始化。可以将其初始化为一个已知变量的地址,如
int x = 10; int *p = &x;
,也可以初始化为NULL
表示未指向任何有效对象。 -
指针的解引用:使用
*
运算符可以访问指针所指向的内存位置上的值。如printf("%d", *p);
输出p
所指向的整数。 -
指针的算术运算:对于指向数组或连续内存区域的指针,可以进行加减运算。加法运算使指针向后移动(增加)相应类型的大小个字节;减法运算使指针向前移动(减少)相应类型的大小个字节。例如,对于指向整型数组的指针
int *p = arr;
,p + 1
将指向数组的下一个元素。 -
指针的比较:可以比较两个指针是否指向同一块内存或在内存中是否有相同的顺序。比较运算符包括
<
,<=
,==
,!=
,>=
,>
。
B.指针与数组的关系
-
指针作为数组参数:函数参数传递数组时,实际上是传递数组首元素的地址。因此,形参可以声明为指针类型,如
void process_array(int *arr, size_t size)
。 -
指针与数组下标:指针和数组下标操作在访问数组元素时是等价的。
arr[i]
等价于*(arr + i)
。 -
指针与字符串:C语言中,字符串本质上是一个字符数组,其最后一个元素是空字符
\0
。字符串字面量(如"Hello"
)在编译时会转换为字符数组,并且其地址可以赋给字符指针。使用指针可以遍历字符串,检查其长度,甚至修改内容。
C.指针与函数
-
指针作为函数参数:通过指针,函数可以修改实参的值,实现参数的双向传递。如
void swap(int *a, int *b)
可交换两个整数的值。 -
指针作为函数返回值:函数可以返回一个指针,指向动态分配的内存或静态/全局变量。如
char *strdup(const char *src)
返回一个复制的字符串。 -
指针与函数指针:函数指针存储的是函数的地址,可以赋值、传递和调用。如
int (*compare)(const void *, const void *)
是一个指向比较函数的指针。
二 动态内存分配与释放
A.内存分配函数
-
malloc(size_t size)
:分配size
字节的连续内存空间,并返回指向该内存区域的指针。如果内存不足或分配失败,返回NULL
。 -
calloc(size_t num, size_t size)
:分配num
个大小为size
字节的对象组成的内存区域,并将其初始化为零。返回指向该区域的指针。 -
realloc(void *ptr, size_t new_size)
:调整已分配内存区域的大小,ptr
是原分配区域的起始地址,new_size
是新大小。成功时返回指向新内存区域的指针,失败时返回NULL
,原内存区域保持不变。 -
aligned_alloc(size_t alignment, size_t size)
:C11新增的函数,分配对齐到alignment
(必须为2的幂)的、大小为size
字节的内存,并返回指向该内存区域的指针。失败时返回NULL
。
B.内存释放函数
free(void *ptr)
:释放由malloc
、calloc
、realloc
或aligned_alloc
分配的内存区域。ptr
必须为先前成功分配且未被释放的内存区域的起始地址。
C.动态内存管理注意事项
-
避免内存泄漏:每次使用
malloc
系列函数成功分配内存后,必须在适当的时候调用free
函数释放,否则会导致内存泄漏。 -
检查返回值:在使用
malloc
、calloc
、realloc
分配内存后,应检查返回值是否为NULL
,以判断分配是否成功。 -
正确释放:只能释放先前通过
malloc
系列函数成功分配的内存,释放其他内存或释放已释放的内存会导致未定义行为。 -
避免悬挂指针:释放内存后,应将指向该区域的所有指针设为
NULL
,防止后续误用这些无效指针。 -
合理分配与释放顺序:当内存块之间存在指针交叉引用时,释放内存时应遵循“先释放子结构,再释放父结构”的原则,防止提前释放导致的悬挂指针。
通过深入理解指针操作和熟练掌握动态内存分配与释放,C语言程序员能够编写出高效、灵活且内存安全的程序。同时,良好的编程习惯,如使用智能指针、内存泄漏检测工具等,也是确保动态内存管理正确无误的重要手段。
标签:释放,入门,指向,C语言,内存,数组,指针,size From: https://blog.csdn.net/weixin_56154577/article/details/137196571