【C语言笔记3】内存管理

内存管理涉及作用域与生命周期,局部变量在栈区,全局变量在数据区。动态内存分配使用malloc函数,使用后需用free释放。程序内存分为代码区、数据区和未初始化数据区。memset和memcpy是进行内存操作的函数。

内存管理

作用域与生命周期

**作用域(可见性)**指标识符能够被使用的范围;只有在作用域内标识符才可以被使用。

生命周期指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的时间段。此阶段针对的是程序的执行过程

(1).局部变量的生存期是:函数被调用,分配存储空间,到函数执行结束,存储空间释放。存储.stack区。

(2).全局变量的生存期是:从程序运行前开始,到执行后结束。存储在.data区

动态生命周期变量存储在堆区.heap。

凡是在函数外定义的变量都在数据区(.data)
凡是在函数内定义的变量都在栈区(.stack)

总结:
1.auto 和 static 局部变量 在{}内def,作用域均在{}内,不同之处在于auto 生命周期仅在{},而static生命周期为整个程序
2.在{}外def的是全局变量,没有标识符,作用域和生命周期都为整个程序,但在其他文件中引用这个变量时需要使用全局变量标识符extern,如extern int a;
3.static全局变量也在函数外定义,但作用域为当前文件
4.静态函数声明:如 static int getG(void)函数的作用域为当前文件
*5.register 寄存器变量,作用域和生命周期和auto相同

在这里插入图片描述

动态内存分配

#include<stdlib.h>
int number;
int *a=(int*)malloc(number*sizeof(int));
//a 可以直接当数组来用
for (int i = 0; i < number; i++)
    {
        scanf("%d",&a[i]);
    }
for (int j = 0; j < number; j++)
    {
        printf("%d",a[j]);
    }
free(a);  //使用完后要归还这片区域
void *malloc(size_t size)

内存布局

程序没有加载到内存前,可执行程序内部已经分好 3 段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把 data 和 bss 合起来叫做静态区或全局区)。

代码区存放CPU的执行指令。代码区通常是只读的,防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息

数据区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)

未初始化数据区存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)

程序在加载到内存前,代码区和全局区(data 和 bss)的大小就是固定的,程序运行期间不能改变
在这里插入图片描述
void *memset(void *s,int c,size_t n) void *memcpy(void *dest,const void *src,size_t)等函数用于通过内存操作字符串(string.h)

memset()常常配合malloc()使用

### C语言动态内存分配学习资料 #### 使用 `malloc` 和 `calloc` 进行动态内存分配 在C语言中,当需要创建大小不固定的数组或其他数据结构时,可以利用标准库中的函数来进行动态内存管理。对于未知长度的字符数组初始化操作如下: ```c #include <stdio.h> #include <stdlib.h> int main(void) { char *a = NULL; int n; printf("请输入数组元素个数:"); scanf("%d", &n); // 动态分配内存空间 a = (char *) malloc(n * sizeof(char)); if (a != NULL) { // 对于成功分配的情况可在此处编写处理逻辑 ... // 释放已分配的空间 free(a); a = NULL; // 防止悬挂指针[^4] } return 0; } ``` 上述代码展示了如何通过用户输入决定要分配多少字节给一个字符类型的数组,并且确保在完成工作之后正确地回收这些资源。 #### 关键点解析 - **`malloc()` 函数**用于请求一块连续的、未初始化的新存储区;它接收所需内存量作为参数并返回指向该区域起始位置的一个通用指针(即void*)。需要注意的是,在实际应用之前应该先检查其返回值是否为空以确认分配过程无误[^2]。 - **`calloc(numElements, elementSize)` 方法**不仅能够获取指定数量的对象所占用的整体尺寸,而且会自动将它们全部置零。这使得程序员不必再单独执行清零动作就能安全使用新获得的数据块[^1]。 为了防止程序崩溃或产生难以追踪的问题,建议每次调用 `free()` 后立即将对应的指针设置成NULL,从而避免形成所谓的“悬空指针”。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值