c语言内存相关

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_38325803/article/details/102674425

动态内存分配

这里说一下为什么要使用动态内存分配,C语言中一切操作都是基于内存的,变量和数组都是内存的别名,如何分配这些内存由编译器在编译期间决定,所以定义数组的时候必须指定数组长度,儿数组长度是再编译器就必须决定了,但是,程序运行过程中,可能需要使用一些额外空间。所以就需要动态内存分配的支持,以下2个函数是与动态内存分配有关:

malloc和free

malloc所分配的是一块连续的内存,以字节为单位,并且不带任何的类型信息,free用于将动态内存归还系统,这里关于malloc和free有几点需要注意:

malloc实际分配的内存可能会比请求的稍微多一点,但是不能依赖编译器的这个行为当请求的动态内存无法满足时malloc直接返回NULL当free的参数为NULL,函数直接返回

calloc和realloc

这两个是malloc的兄弟,他们分别具备以下特性:

calloc的参数代表返回内存的类型,切会将返回的内存初始化为0realloc用于修改一个原先已经分配的内存块大小。在使用realloc之后应该使用其返回值。

程序中的三种内存

程序中的栈栈是现在计算机程序里最为重要的概念之一,栈在程序中用于维护函数调用的上下文,没有栈就没有函数,没有局部变量

程序中的堆栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,而堆是程序中一块巨大的内存空间,可由程序自由使用,堆中的程序申请使用的内存在程序主动释放前一直有效系统对堆的管理方法有空闲链表法,位图法,对象池法等等

程序中的静态存储区程序静态存储区随着程序的运行而分配空间,直到程序运行结束在程序的编译期静态存储区的大小就已经确定程序的静态存储区主要用于保存程序中的全局变量和静态变量与栈和堆不同,静态存储区的信息会最终保存到可执行程序中。

程序的内存布局

我们先来看一张图

一个可执行程序的内存布局

各个段的作用堆栈在程序运行后才正式存在,是程序运行的基础.bss段存放的是未初始化的全局变量和静态变量.text段存放的是程序中的可执行代码.data段保存的是已经初始化了的全局变量的静态变量.rodata段存放的是程序中的常量值,一般为字符串常量,普通常量存放在代码段。野指针

什么是野指针?

野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的。野指针不是NULL指针,是指向不可用内存的指针C语言中没有任何手段可以判断一个指针是否为野指针 野指针的由来

局部指针没有初始化,结构体变量中的指针没有初始化使用已经是否过后的指针指针所指向的变量在指针之前被销毁

C语言设计规则

在使用malloc申请了内存之后,应该立即检查指针是否为NULL,防止使用值为NULL的指针牢记数组的长度,防止数组越界操作,考虑使用柔性数组动态申请操作必须和是否操作匹配,防止内存泄漏和多次释放free指针之后必须立即赋值为NULL

猜你喜欢

转载自blog.csdn.net/qq_38325803/article/details/102674425
今日推荐