C语言内存管理和结构体定义详解

1 下载量 2 浏览量 更新于2024-08-03 收藏 3KB MD 举报
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语言中的内存分配与释放方法,避免内存泄漏等问题。还可以熟练使用结构体与联合进行数据组织。