C语言内存管理与联合结构课件笔记
本资源主要讲解了C语言中的内存管理和结构体与联合的使用。内存管理部分详细介绍了堆栈概念、动态内存分配函数、内存泄漏和悬挂指针等问题,并提供了示例代码。结构体与联合部分则详细讲解了定义、访问和嵌套使用,同样配有代码实例说明。
**内存管理**
内存管理是C语言编程中至关重要的一部分。合理地分配和释放内存可以提高程序的效率和稳定性。内存管理技术包括内存的分配、释放、堆和栈的概念等。
**堆和栈的概念**
* 堆(Heap):用于动态分配内存,大小可变,需要手动释放。
* 栈(Stack):用于存储函数调用的局部变量和返回地址,自动分配和释放。
**动态内存分配函数**
* `malloc(size_t size)`: 分配指定大小的字节内存,返回指向首字节的指针。
* `calloc(size_t num, size_t size)`: 分配 num*size 大小的内存,初始化为 0。
* `realloc(void *ptr, size_t size)`: 重新分配内存,可以扩大或缩小已分配的内存块。
* `free(void *ptr)`: 释放动态分配的内存。
**内存泄漏与悬挂指针**
* 内存泄漏:分配内存后未释放,导致内存资源浪费。
* 悬挂指针:释放内存后未置空,可能导致错误访问。
**动态内存分配示例**
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int *)malloc(5 * sizeof(int)); // 分配 5 个 int 大小的内存空间
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i * 2; // 赋值
}
for (int i = 0; i < 5; i++) {
printf("%d", ptr[i]); // 打印
}
free(ptr); // 释放内存
ptr = NULL; // 置空指针
return 0;
}
```
**内存管理的注意事项**
* 动态分配的内存需要手动释放,避免内存泄漏。
* 释放内存后,应将指针置空,防止悬挂指针。
* 访问分配内存前,应检查内存是否成功分配。
* 避免多次释放同一块内存。
**结构体与联合**
结构体是C语言中的一种数据结构,它可以将多个变量组合成一个单元。联合是结构体的一种特殊形式,它可以将多个变量组合成一个单元,但只能存储其中一个变量的值。
**定义和访问结构体**
```c
#include <stdio.h>
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
struct Student s1;
strcpy(s1.name, "Alice");
s1.age = 20;
s1.gpa = 3.8;
printf("");
return 0;
}
```
本资源适合学习C语言的学生或者初级开发人员,通过学习可以全面掌握C语言中的内存分配与释放方法,避免内存泄漏等问题。还可以熟练使用结构体与联合进行数据组织。