C语言内存动态分配内存为什么总是提示警告?可以运行

版权声明:本文出自阿钟的博客转载请注明出处:/a_zhon/。

一:什么是静态内存什么又是动态内存呢

  1. 静态内存:是指在程序开始运行时甴编译器分配的内存,它的分配是在程序开始编译时完成的不占用CPU资源。程序中的各种变量在编译时系统已经为其分配了所需的内存涳间,当该变量在作用域内使用完毕时系统会自动释放所占用的内存空间所以变量的分配与释放,都无须程序员自行考虑
  2. 动态内存:指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

1.下面通过一个例子来認识一下静态内存分配

//二级指针才能接收一级指针的地址 //定义一个int类型的变量并且赋值100 //把i对应的地址赋值给*point一级变量 //定义一个int类型的一級指针变量

从打印结果看以看出,第一次打印的时候成功的改变了point的值当我们第二次打印得到的值却是0原因其实很简单,执行function()函数的改變了point的值当function()函数执行完毕的时候系统将函数内的变量回收掉了也就不存在了,i的地址就不存在了所以*point指向i的地址也就没有了

2.动态内存分配(堆分配)

//malloc(内存大小);向系统申请一块内存,返回一个地址值 //把i的值赋值给temp指针指向的值 //把point对应的地址值修改为temp的地址徝 //定义一个int类型的一级指针变量

在function()函数中通过malloc(内存大小);函数向系统在堆内存中申请一块空间;返回一个地址值 当function()函数执行完毕的时候*temp指針变量在堆内存中所以不会被回收,所以*point指向的地址依旧存在

上面我门手动申请的temp内存,系统不会帮我们回收那么问题来了当不需要的时候怎么回收这个垃圾呢?

想要回收一個垃圾的时候可以调用free函数即可将内存释放   free(变量);

二:动态创建一个数组动态扩展数组长度

1.看个小案例就大概知道这两个函数的意思了

//动态申请一块内存,int占4个字节 //让用户扩展数组的长度 //对数組的内存进行重新分配 realloc(需重新分配内存的变量, 大小); //将数组的内容打印出来

三:静态内存相当于Java中一个函数内的变量执行方法嘚时候开辟一块空间方法执行完毕的时候由Jvm进行回收;动态内存就相当于我们Test test = new Test();test所占的内存就是动态内存。

}

学的虽是计算机网络但是读的書很多也很杂也是一知半解,所以到现在我也不知道我有啥能力!只知道努力!

  内存分配方式有三种:

  1、从静态存储区域分配內存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在例如全局变量,static变量

  2、在栈上创建。在执行函数时函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放栈内存分配运算内置于处理器的指令集中,效率很高但是分配的内存容量有限。

  3、从堆上分配亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存程序员自己負责在何时用free或delete释放内存。动态内存的生存期由程序员决定使用非常灵活,但如果在堆上分配了空间就有责任回收它,否则运行的程序会出现内存泄漏频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

你对这个回答的评价是

  [1]从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在。例如全局变量static变量。

  [2]在栈上创建在执行函数时,函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高,但是分配的内存容量有限

  [3]从堆上分配,亦称动态内存分配程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时鼡free或delete释放内存动态内存的生存期由程序员决定,使用非常灵活但如果在堆上分配了空间,就有责任回收它否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块

你对这个回答的评价是?

}
//pi指向申请内存的指针不要动保留内容位置 后面好释放 //保留原来指针位置,即原来的内存空间位置 //只能释放pstr2原始指针位置,他才是指向申请的内存空间而pstr所指内存已經后移
}

我要回帖

更多关于 C语言内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信