《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)(一)

简介: 本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!

内存管理

1. 什么是动态内存

就是开辟在堆上的内存,而且要用特定的函数去开辟,我们常用的是malloc,和free(释放空间)



112.png

返回一个内存块给用户,返回成功就是那块空间的起始地址,失败就是NULL。

113.png

free释放空间,参数就是之前获取返回值的指针变量。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#define N 10
int main()
{
        int *p = (int*)malloc(sizeof(int)*N); //动态开辟空间
        if (NULL == p){
        return 1;
        }
        for (int i = 0; i < N; i++){
        p[i] = i;
        }
        for (int i = 0; i < N; i++){
        printf("%d ", i);
        }
        printf("\n");
        free(p); //开辟完之后,要程序员自主释放
        system("pause");
        return 0;
}


2. 为什么要有动态内存


1. 在技术方面,普通的空间申请,都是在全局或者栈区,全局一般不太建议大量使用,而栈空间有限,那么如果一个应用需要大量的内存空间的时候,需要通过申请堆空间来支持基本业务。

 


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#define N 10
int main()
{
    char a[1024 * 1024]; //就简单的1M空间,程序就崩溃了
    system("pause");
    return 0;
}

2. 在应用方面,程序员很难一次预估好自己总共需要花费多大的空间。想想之前我们定义的所有数组,因为其语法约束,我们必须得明确"指出"空间大小.但是如果用动态内存申请(malloc),因为malloc是函数,而函数就可以传参,也就意味着,我们可以通过具体的情况,对需要的内存大小进行动态计算,进而在传参申请,提供了很大的灵活性

3. 栈、堆和静态区


114.png115.png116.png

我们发现地址从上到下依次增大,而且堆区(heap addr)和栈区差距巨大,也就是说中间有巨大的漏空(堆区向上增长,栈区向下增长)(也就是我们图中所看到的)。



117.png118.png

问一个问题:在C语言中,为何一个临时变量,使用static修饰之后,它的生命周期变成全局的了?

119.png

编译的时候被编译进了全局数据区。(全局特性,但是注意作用域还是不变,只是生命周期是整个程序的生命周期)

PS:栈区随着申请与释放而进行空间管理,而其他的区,基本上都是随着整个程序的运行而一直存在。


4.

4.1. 常见的内存错误


1.指针没有指向一块合法的内存

2.为指针分配的内存太小

3.内存分配成功,但并未初始化

4.内存越界(越界是一个很严重的问题,但不是所有严重的问题都会表现出来 )

5.内存泄漏


4.1. 注意


120.png

assert称为断言,如果内部条件不满足,就会报错,满足就什么都不做。但是一般用if,因为如果我们需要的情况是指针为NULL(默认行为)assert是解决不了的,而且assert一般只有在发布方式为 Debug下面有效,还有要是我们自己定义一个地址去指向非法行为,assert(if)也是没有办法去判断的,因为他也不知道用那个地址是不是非法的,所以我们写指针如果未直接引用,就要设置为NULL。  

相关文章
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
72 6
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
75 11
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
79 1
|
2月前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
58 3
|
3月前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
3月前
|
C语言
【C语言的完结】:最后的测试题
【C语言的完结】:最后的测试题
25 3
|
3月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
3月前
|
C语言
保姆级教学 - C语言 之 动态内存管理
保姆级教学 - C语言 之 动态内存管理
30 0
|
机器学习/深度学习 Java C语言
c语言基础学习08_关于内存管理的复习
=============================================================================对于c语言来讲,内存管理是一个很重要的内容,它与指针是息息相关的,因为内存的管理都是通过指针来实现的。
1026 0
|
8天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
45 23

热门文章

最新文章