当前位置:首页 > 内存 > 正文

动态分配内存C语言

  • 内存
  • 2024-08-12 08:28:18
  • 225

一、C语言malloc()函数分配内存空间尺寸的问题

这个问题首先得从栈说起程序一般分为三段:代码段、数据段(静态数据)、栈段。堆栈段存储程序中的变量、程序传递的参数等(动态分配的变量存储在堆中,静态分配的变量存储在堆栈中)。堆栈的增长如下:

程序运行时会预先分配堆栈空间,所以你的问题不一定改变了不应该改变的部分很可能原本就是空的。


回到malloc函数,malloc主要负责分配空间并返回空间的起始地址。那么为什么请求的空间是0,却可以存储7个字符呢?这是因为C语言中的指针不检查数组越界问题。不信的话,可以这样做:chach[5],然后读写ch[6](printf或scanf)。,并且不会报错。但是我们在使用的时候一定不要超出限制的使用,因为这样的程序是非常危险的。想象一下,如果越界使用的地址恰好是操作系统的地址,只要你改变它。,系统就会崩溃。同时,C语言的这种机制被黑客广泛运用在缓冲区溢出攻击中,所以不仅不能使用指针越界,还必须时刻考虑指针(数组)是否越界,以提高安全性。程序的安全性。


希望对您有用。。。


二、C语言,为什么动态内存分配申请后,还要再释放?1、即使没有free(),malloc()中的内存也会在main()退出时自动释放。这里的监视器就是操作系统。设计良好的操作系统会注册分配给它的每块内存。即使应用程序本身失控,这也可以有效地回收内存。这样,程序自己的free()操作显然不会被执行,但不会出现内存泄漏。
()的目的是实时回收内存。如果你的程序很简单,不写free()是没有问题的。该程序在完成之前不会使用太多内存或降低系统性能。系统会自动完成。然而,当你开始开发大型程序时,你就会意识到不写free()的后果是非常严重的。您很可能需要在程序中分配10M内存10k次。如果每次使用后都使用free()释放内存,那么你的程序只需要占用10M内存即可运行。free(),程序退出前消耗100G内存。这当然包括大部分虚拟内存,但由于虚拟内存操作需要读写磁盘,因此对系统性能有很大影响。结果,系统可能崩溃。
3.始终为每个malloc()编写相应的free()是一种良好的编程习惯。这不仅体现在处理大型程序时的必要性,还体现在程序良好的风格和健壮性上。毕竟,只有您的程序知道它为什么操作分配了哪些内存以及何时不再需要它。因此,该内存最好由您自己的程序重用。