user-0 提问: 51单片机动态数组开辟问题

回复:
user: user-1
content: 仅供参考： //使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  个人意见：不使用动态分配。

user: user-0
content: 引用 12 楼 jennyvenus 的回复:引用 11 楼 wenlongcai1995 的回复:[quote=引用 7 楼 jennyvenus 的回复:] space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset [/quote]恩 是的 不过在51里面如果要用到free()和malloc（）函数的话还要给init_meepool()函数初始化 麻烦你解释解释下

user: user-2
content: 引用 11 楼 wenlongcai1995 的回复:引用 7 楼 jennyvenus 的回复:space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset

user: user-3
content: 在单片机那么有限的内存里面玩动态申请，是难以保证可靠性的。 程序首先应该考虑可靠性，如果分配失败就可能是灾难性的后果。其实在PC机或者移动设备上编程也是类似的。只是我们有足够大的内存可用，所以可以放心的让操作系统来动态分配。另一方面，也是最主要的原因，大家都觉得分配失败不是个什么问题，程序重启也是用户可以容忍的。事实上，低可靠性损失的是用户体验，那比功能缺失更加可怕。

user: user-2
content: 引用 13 楼 wenlongcai1995 的回复:引用 12 楼 jennyvenus 的回复:[quote=引用 11 楼 wenlongcai1995 的回复:] [quote=引用 7 楼 jennyvenus 的回复:] space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset [/quote]恩 是的 不过在51里面如果要用到free()和malloc（）函数的话还要给init_meepool()函数初始化 麻烦你解释解释下[/quote] 不懂，51里面我们从来不动态申请，有时候内存复用，也是自己写.

user: user-0
content: 引用 7 楼 jennyvenus 的回复:space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图

user: user-0
content: 引用 5 楼 airelf 的回复:free(space);   //所谓释放space内存，表示这块内存以后不能再被使用了，但不表示这块内存的内容被清零 space=NULL;   //让space指向空地址，表示space这个指针指向的地址设置为null ,即这个变量自身的值被清零 那51里面有什么库函数能够实现对数组的内容和内存进行清零而保持内存能够继续使用吗 或者能给个建议能实现开辟一个长度可以改变的内存

user: user-0
content: 在调试SPACE=null这段语句时 内存没被释放可是至少space[0]和space[3]应该 等于0吧？我是这么理解的 可是我用keil调试发现space[0]和space[3]都是1，也就是上一次的赋值没被释放 麻烦大家再帮我看看 或者能给个建议能显示开辟一个长度可以改变的内存

user: user-4
content: 内容是NULL不是释放内存

user: user-2
content: space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-5
content: free(space);   //所谓释放space内存，表示这块内存以后不能再被使用了，但不表示这块内存的内容被清零 space=NULL;   //让space指向空地址，表示space这个指针指向的地址设置为null ,即这个变量自身的值被清零

user: user-6
content: 数组的长度每次都会改变 可以用realloc

user: user-7
content: 指针消亡了，并不表示它所指的内存会被自动释放。同样，内存被释放了，并不表示指针会消亡或者成了 NULL 指针。

user: user-8
content: 发现上一次的首元素的内存一直无法释放，于是本人通过调试测试每一次数组各元素的值来判断哪里出错，发现程序到space=NULL,space[0]还是没有被清零，  好久没玩51了，首元素的内存无法释放是什么意思？程序执行完space = NULL后，也即是space = NULL的下一条语句才执行了space = NULL,这个时候才是查看是否有问题，你既然释放了这个内存，51单片机有保证释放的内存会清零么？

user: user-9
content: 引用 楼主 wenlongcai1995 的回复:我想要达到的效果是开辟一个动态数组，数组的长度每次都会改变。遇到的问题是，发现上一次的首元素的内存一直无法释放，于是本人通过调试测试每一次数组各元素的值来判断哪里出错，发现程序到space=NULL,space[0]还是没有被清零，以下是我的测试程序 告诉我你的51单片机编译器名字，以及工程的内存模型（比如Keil就区分small,compact,large几种内存模型）。以及你是如何测试的？即你的测试程序是纯软件模拟，还是实际硬件仿真器上运行？