OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5756|回复: 2

函数内部直接定义数组与分配动态内存的区别

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-4-8
在线时间
13 小时
发表于 2017-4-21 18:19:57 | 显示全部楼层 |阅读模式
10金钱
void func_1(void)
{
    u8  temp[256];
    ……
}

void func_2(void)
{
    u8 *temp;

    temp = (u8*)mymalloc(SRAMIN,sizeof(u8)*256);
    ……
    myfree(SRAMIN,temp);
}

如上所示,按照我的理解,这两个函数应该并没有区别,无论是直接定义一个数组,还是下面的动态内存分配,其结果都是在内存中
开辟一块256的空间,函数结束后,清除该空间。

但实际测试时发现,用分配动态内存的方式,可以正常运行。
但如果是直接定义数组的话,则程序会卡死,跳转到HardFault_Handler
有大神能够帮忙指点一下么?

PS. 这是添加在uCOSiii中一个task中的函数,该task 堆栈设置的是1024 ,是否跟这个有关系呢?


最佳答案

查看完整内容[请看2#楼]

你需要去学习堆和栈的区别!这两种方法肯定都是开辟一段内存!但是如果直接在函数里面定义一个数组的话这个数组的内存是栈上的,如果用了系统的话就是这个任务的堆栈上。但是使用malloc的话内存就在堆上,如果是mymalloc申请内存的话就在mymalloc对应的内存堆上,就是一个数组。这两种方法区别大的去了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-4-21 18:19:58 | 显示全部楼层
你需要去学习堆和栈的区别!这两种方法肯定都是开辟一段内存!但是如果直接在函数里面定义一个数组的话这个数组的内存是栈上的,如果用了系统的话就是这个任务的堆栈上。但是使用malloc的话内存就在堆上,如果是mymalloc申请内存的话就在mymalloc对应的内存堆上,就是一个数组。这两种方法区别大的去了!
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-4-8
在线时间
13 小时
 楼主| 发表于 2017-4-28 09:49:36 | 显示全部楼层
zuozhongkai 发表于 2017-4-21 18:19
你需要去学习堆和栈的区别!这两种方法肯定都是开辟一段内存!但是如果直接在函数里面定义一个数组的话这个 ...

哦,明白了。看来我这方便的知识还有很大欠缺,多谢多谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 16:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表