|
测试环境:STM32+IAR6.4 堆区大小设置为0x1000(默认值)。5 L8 M, e/ g2 J4 c$ v 变量定义: char *p=NULL;5 X0 Y# ]# i7 R7 F; _ char *p2=NULL;3 w9 U$ ^* i" {, D. F% `4 o6 t 1. 申请内存大小超过设置值5 M' l1 |/ S# s0 P* c p = (char *)malloc(sizeof(char)*5090);1 ?. T+ n6 L/ H malloc返回NULL,使用这段内存是会出错(硬件错误)。4 N9 d) d6 y. l, Q ~# c1 r 2.申请两段内存,每段不超过设定值,但总和超过设定值。- J9 O/ O/ j# e' l% H" E9 s p = (char *)malloc(sizeof(char)*3090); if(p== NULL) { printf("malloc error1\r\n");) ~2 j. e1 t8 U" {2 a } p2 = (char *)malloc(sizeof(char)*3090);7 p M1 {- q( ]( R8 e- G if(p2== NULL) { printf("malloc error2\r\n"); } p2为NULL,使用时会出错。0 Z, s$ L# l/ h9 G3 k0 e% L$ s 3.申请一段内存,使用完毕后释放掉,然后再申请一段内存 p = (char *)malloc(sizeof(char)*3090);) o: K" h% h; w- r . f& E) t& C+ h# G1 P6 {3 M( L if(p== NULL) {8 Y/ w+ v+ }# ]: P printf("malloc error1\r\n"); } ...& K" S* G. p7 ?9 k% q+ k% h free(p);+ T/ I! }* z' \9 |1 z% Z) d p2 = (char *)malloc(sizeof(char)*3090);, b1 U" ~3 i5 D k% h- {# {! ~$ a if(p2== NULL) { printf("malloc error2\r\n");4 E8 o" A6 o' }6 ^8 `3 Q5 c p } ...5 Z2 O" \' w0 g/ ?4 z free(p2); 使用正常。 $ v/ f( \1 q/ F4 w 申请内存,使用完毕后要释放。% ^7 ]# n, b2 a- [( O IAR设置堆栈大小 option->Linker -> Config -> Override default ->Edit。+ G9 j" c* s5 \4 l * p& j& }+ y# g5 ? 如有错误,欢迎指正,欢迎拍砖!5 }! R- B; I0 W3 C! W; f |
| 那肯定的。老申请不释放那就用完了。 |
不错 不错 |
| 谢谢分享! |
| 谢谢分享! |
| 请教一个问题,设定堆区的大小后,系统启动的时候不需要作跟堆相关的初始化,就可以调用malloc()函数来分配动态内存吗? |
| 谢谢分享! |
| 直接使用系统malloc会有内存碎片吧? |
微信公众号
手机版