C语言基础-存储类别、链接和内存管理
2021-02-01 06:14
标签:ted 依赖 core 返回 c语言基础 文件中 程序员 内存泄露 赋值 auto说明的变量只能在某个程序范围内(局部)使用,通常在函数体内或函数中的复合语句里。(默认是随机值),在函数体的额某程序段内说明auto存储类型的变量一般省略关键字auto,如下: register称为寄存器变量,register变量是想将变量放入CPU寄存器中,这样可以加快程序的运行速度,如申请不到就使用一般内存,如auto 注意: register变量必须是能被CPU所接受的类型,这通常意味着register变量必须是一个单个的值,并且长度应该小于或等于整型长度; 不能使用`&`来获取register变量的地址 static变量称为静态变量,既可以在函数体内,也可以在函数体外说明(默认是0);static在内存中以固定地址存放,而不是以堆栈方式存放的,只要没结束就不会随着说明它的程序段的结束而销毁,它下次再调用该函数,该存储类型不会重新声明,且保存上次调用的值(升级为全局变量的生命周期) static修饰的变量,在其他文件不能使用 当变量在一个文件中的函数体外声明(全局变量),所有的而其他文件中的函数或程序段都可以引用这个变量; extern称为外部参照引用型,使用extern声明的变量是从外部拿来的; 如果引用static修饰的全局变量,是无法引用的 - C/C++定义了4个内存区间: - 静态存储分配 通常定义变量,编译器在编译时都可以根据该变量的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的内存空间 - 在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放, 栈内存分配运算内置与处理器的指令集中,效率很高,但是分配的内存容量有限 - 有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统跟你局运行时的要求进行内存奶粉恩平,这种方法称为动态内存分配; - 所有动态存储分配都在堆区中进行 - 从堆上分配,亦称动态分配。程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存的额生存期由程序员本身来决定,使用非常灵活,但问题也最多 - 当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量或对象。当不再使用该变量或对象时,也就是它的声明结束时,要显示释放它所占用的存储空间,这样系统就能对该堆空间再次分配,做到重复使用有限的资源 - 堆区是不会自动在分配时做初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化 使用需要引入 Ps:如果出现 说明free释放内存不是malloc创建的或不完整的 注意事项: 不是指向NULL的指针,是指向"垃圾"内存的指针,"野指针"是很危险的 - 指针变量没有被初始化 - 指针p被free后,没有置为NULL,让人误以为是合法指针 - 指针超越了变量的作用范围,这种情况让人防不胜防 Demo: C语言基础-存储类别、链接和内存管理 标签:ted 依赖 core 返回 c语言基础 文件中 程序员 内存泄露 赋值 原文地址:https://www.cnblogs.com/binHome/p/12814176.html存储类别
auto
auto int k;
int j;
double x;
register
static
#include
extern
// test.c
int i = 10;
// main.c
#include
动态内存
动态内存分配
堆内存的分配与释放
malloc/free
#include
void *malloc(size_t num);
void free(void *p);
#include
hello(54168,0x11289adc0) malloc: *** error for object 0x7ffe0c4058f1: pointer being freed was not allocated
hello(54168,0x11289adc0) malloc: *** set a breakpoint in malloc_error_break to debug
野指针
野指针形成的主要原因
#include
下一篇:Java中的多态