malloc函数在51单片机上的怪现象,不信自己试试

zp824382268qqcom 2011-03-04 08:44:46
各位是这个才对,,我用的stc89c55想测试一下malloc函数但编译后无错误,但有两个警告,当我下到单片机里,结果是灯全不亮,两种结果都不是,,我郁闷啊,,有高手遇到过这样的事吗,不信试试,,
#define NULL 0 //定义NULL为空
#define uchar unsigned char //宏定义
#include <REGX55.H> //调用55头文件
#include<stdlib.h> //包含头文件
void main()
{
uchar *point = NULL; //定义uchar型指针初始化为空
point= (uchar*)malloc(sizeof(uchar)); //调用malloc函数且赋值于point
if (point==NULL) //判断申请是否成功,如果不成功点亮p2口所有灯
{
P2=0;
}
else //如果申请成功赋值*P内容十进制数87 ,且取其中内容赋值于p2口
{

(*point)=87;
P2=(*point);

}
free(point); //释放指针
point=NULL; //防止产生野指针
while(1); //暂停程序
}
assembling STARTUP.A51...
compiling 普中--灯试验.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_INIT_MEMPOOL?INIT_MEM
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?C_INITSEG
Program Size: data=13.0 xdata=8 code=612
creating hex file from "普中--灯试验"...
"普中--灯试验" - 0 Error(s), 2 Warning(s).

...全文
2523 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zp824382268qqcom 2011-03-15
  • 打赏
  • 举报
回复
我在二十四楼 已经改好了 应该是 mallo函数申请的空间在data区 但定义的指针却是外部的 有懂得参见二十四楼 分析一下原因
schlafenhamster 2011-03-13
  • 打赏
  • 举报
回复
你不管编译器的warning自己作主。该习惯不好,而且:
point= (uchar*)malloc(sizeof(uchar)); //调用malloc函数且赋值于point
也没成功。
zp824382268qqcom 2011-03-07
  • 打赏
  • 举报
回复
这是我改后的可以实现了,就是把uchar*p=NULL改为了uchar data *data point = NULL;
#define NULL 0 //定义NULL为空
#define uchar unsigned char //宏定义
#include <REGX55.H> //调用55头文件
#include<stdlib.h> //包含头文件
void main()
{
uchar data *data point = NULL; //定义uchar型指针初始化为空
//init_mempool(0x1000,100);
point= (uchar*)malloc(sizeof(uchar)); //调用malloc函数且赋值于point
if (point==NULL) //判断申请是否成功,如果不成功点亮p2口所有灯
{
P2=0;
}
else //如果申请成功赋值*P内容十进制数87 ,且取其中内容赋值于p2口
{

(*point)=87;
P2=(*point);

}
free(point); //释放指针
point=NULL; //防止产生野指针
while(1); //暂停程序
}
zp824382268qqcom 2011-03-05
  • 打赏
  • 举报
回复
谢各位了,,以后多多指点 一起推动中国的嵌入式 呵呵
zp824382268qqcom 2011-03-04
  • 打赏
  • 举报
回复
奥 谢谢大家了,我那两个警告是怎么来的,,,我刚入这行不久,各位见笑了,,以后多多指教
Great_Bug 2011-03-04
  • 打赏
  • 举报
回复
在使用malloc之前,是要对某个(可能是若干个)全局变量进行初始化的,可能你没有做或没做对。。。。
zp824382268qqcom 2011-03-04
  • 打赏
  • 举报
回复
怎么都侧面回答我的问题,是高手就把上边那个程序整好,让灯亮起来,,不是这样应用,我也知道,这不是个测试吗,这样做到底哪错了,,,
codesnail 2011-03-04
  • 打赏
  • 举报
回复
还有就是版主说的效率问题。。。。。。。还有内存碎片。。。。。。。。。。。。等等。。。。。
codesnail 2011-03-04
  • 打赏
  • 举报
回复
操作系统的程序是经过严格测试的,并且其用的堆内存也被控制在了一定的范围内。
codesnail 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 schlafenhamster 的回复:]

嵌入式程序为什么不能用堆内存,个人觉得这是不可避免的啊,
嵌入式程序可以用堆内存,但与芯片有关,如果是ARM就可以。
如果是51,不止malloc不好用,很多C库函数都不好用。
[/Quote]

我见过的嵌入式系统中,也只是操作系统用对内存,一般应用不提倡用的。。。。。
因为堆内存有不可预知性,比如万一申请不到内存怎么办,一般嵌入式系统资源有限。
有很多公司的设计基准明确规定不允许使用堆内存。
schlafenhamster 2011-03-04
  • 打赏
  • 举报
回复
嵌入式程序为什么不能用堆内存,个人觉得这是不可避免的啊,
嵌入式程序可以用堆内存,但与芯片有关,如果是ARM就可以。
如果是51,不止malloc不好用,很多C库函数都不好用。
Ejack79 2011-03-04
  • 打赏
  • 举报
回复
那两个警告已经说的很明确了。
LZ如果不知道初始化内存池那是自找的……
lbing7 2011-03-04
  • 打赏
  • 举报
回复
首先:单片机行当,没事别用这个函数

其次,如果非要用,我记得在用之前得很指定一个要分配的缓冲区和大小

最后,如果非用到动态分配,建议用多个数组自己管理好即可,这样效率还有保障些

zp824382268qqcom 2011-03-04
  • 打赏
  • 举报
回复
那就麻烦前辈指点了,依您之见,要实现那个功能怎么改才对,应该怎么用我的方向错在哪了,一定追加分
codesnail 2011-03-04
  • 打赏
  • 举报
回复
你居然申请一个char型长度的内存,,,,我无语了。。。。。
是不可避免,不过不是你这么用的。。。。。。
你如果在一个错误的方向上,是不会提高的,听人劝,吃饱饭。。。。

lz还是再复习下c语言吧。。
zp824382268qqcom 2011-03-04
  • 打赏
  • 举报
回复
嵌入式程序为什么不能用堆内存,个人觉得这是不可避免的啊,,那关于这个现象又怎么解释呢,,我在keil上用软件仿真的时候,p2口确实是显示的是十进制的87(二进制的1010111),但怎么倒是记得单片机里就不行,,难道51的内核处理不了malloc还是我的程序有bug,期待高手出现
codesnail 2011-03-04
  • 打赏
  • 举报
回复
嵌入式程序不建议用堆内存。。。。。。
schlafenhamster 2011-03-04
  • 打赏
  • 举报
回复
init_mempool(0x1000,100); 是配置在XDATA 上的,所以你的单片机要有外存。
C51.pdf是安装Keil时自带的,也可以从网上下载。我没条件写片。
zp824382268qqcom 2011-03-04
  • 打赏
  • 举报
回复
什么是外存配置改变,我是菜鸟,还有51 pdf是什么在哪下载的,,请问像我这种情况,您可推荐一本书吧,有些东西我不太懂,,,顺便问一下您修改之后 可以在单片机上运行了吗,,,在线等待,,
schlafenhamster 2011-03-04
  • 打赏
  • 举报
回复
Keil 的‘C51。pdf’有一段:
Before using any of these functions to allocate memory, you must first specify,
using the init_mempool routine, the location and size of a memory pool from
which subsequent memory requests are satisfied.
加载更多回复(6)

27,516

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧