搜索
bottom↓
回复: 19

有办法在程序运行时改变全局数组大小么

[复制链接]

出0入0汤圆

发表于 2017-11-10 03:17:08 | 显示全部楼层 |阅读模式
大概如下

int g_a[n];  // 全局变量

n准备eeprom读出来,有什么方法能用实现么

开发环境:MDK

谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入4汤圆

发表于 2017-11-10 04:46:34 来自手机 | 显示全部楼层
n定义成最大值,然后进行动态分配

出0入93汤圆

发表于 2017-11-10 06:01:56 | 显示全部楼层
MDK支持C++,STL里面的std::vector可以当做动态数组干这个用
不用C++只用C的话,用malloc动态分配吧

出0入0汤圆

发表于 2017-11-10 08:17:16 | 显示全部楼层
动态分配malloc,keil中试用堆空间,用完了记得释放行了

出0入4汤圆

发表于 2017-11-10 08:43:07 | 显示全部楼层
uint8_t *p = new uint8_t[n]; C++是这么干的

出0入0汤圆

发表于 2017-11-10 09:33:02 | 显示全部楼层
一般的话用malloc动态分配,可靠性要求严格的直接定义一个能允许的最大的数组。

出0入0汤圆

发表于 2017-11-10 09:41:28 | 显示全部楼层
C语言 malloc
C++  new

要记得free或者delete

出0入0汤圆

发表于 2017-11-10 10:06:16 | 显示全部楼层
动态分配把

出330入0汤圆

发表于 2017-11-10 10:12:43 来自手机 | 显示全部楼层
在定义时弄成最大空间,后面在调用时量体裁衣不就行了吗?动态内存不注意的话,溢出,泄露了才麻烦。

出0入4汤圆

发表于 2017-11-10 10:47:35 | 显示全部楼层
真巧,前两天我也在考虑类似的问题。方案1,先声明一个指针然后分配内存,但是此时占用堆空间,不注意 程序容易挂掉,如果空间太大还要改底层文件,懒得改。后来想到另外一个办法,方案2:先定义几个数组,有大有小,然后声明一个指针P,如果需要大空间就将P指向大数组,如果需要小空间就指向小数组

出0入0汤圆

发表于 2017-11-10 11:21:55 | 显示全部楼层
用动态分配,不过单片机环境的话,建议你用定义最大数组来完成

出0入22汤圆

发表于 2017-11-10 12:03:49 | 显示全部楼层
楼上没一个说到点子上,我来告诉LZ怎么做比较好

1,定义大数组的方法可行,但不方便,到底多大才是大?
2,如何充分利用芯片ram?实际程序编译完后是有一些ram没有用到的,不用岂不浪费?

鉴于以上两点,有个好办法:

MDK编译器有个好东西,可以知道编译完后程序使用的最大ram地址,那就是 Image$$RW_IRAM1$$ZI$$Limit
通过这个 Image$$RW_IRAM1$$ZI$$Limit,我们知道了程序使用的ram最大地址,然后自己又知道芯片实际最大ram容量,那么我们就可以知道最终剩余多少ram是没有被利用到的
这下好了,定义一个指针ram_pt =&Image$$RW_IRAM1$$ZI$$Limit; 然后ram_pt就可以随便你用了,只要不超过芯片最大ram容量,随你折腾,反正也就这么多ram,用多用少随便你了

好了,教你一招,你要不要请我吃饭?

出0入0汤圆

发表于 2017-11-10 12:36:09 | 显示全部楼层
jiaowoxiaolu 发表于 2017-11-10 12:03
楼上没一个说到点子上,我来告诉LZ怎么做比较好

1,定义大数组的方法可行,但不方便,到底多大才是大?

楼上这方法巧妙是巧妙,不过可用多少随着代码的增加而改变,也是让人有点心里没底

我们公司采用的是1.内存池的方式malloc和release 2. 定义最大数组,因为实际是不会无限大的,只要知道最大的情况是多少

出0入8汤圆

发表于 2017-11-10 13:00:34 | 显示全部楼层
链表                 

出0入0汤圆

发表于 2017-11-10 13:20:28 | 显示全部楼层
bolizhicheng204 发表于 2017-11-10 10:47
真巧,前两天我也在考虑类似的问题。方案1,先声明一个指针然后分配内存,但是此时占用堆空间,不注意 程序 ...

握手,跟你的用法一样。按需分配,复用。

出0入0汤圆

 楼主| 发表于 2017-11-11 03:54:35 | 显示全部楼层
jiaowoxiaolu 发表于 2017-11-10 12:03
楼上没一个说到点子上,我来告诉LZ怎么做比较好

1,定义大数组的方法可行,但不方便,到底多大才是大?

谢谢,按您的意思,知道剩余多少ram没用,就可以把没用的ram都分配给 stack和 heap.
那内存泄漏会在什么时候发生呢,申请不到内存的话 malloc不是会返回 空值吗

不太懂 这个啥意思 ram_pt =&Image$$RW_IRAM1$$ZI$$Limit

出0入0汤圆

 楼主| 发表于 2017-11-11 04:01:03 | 显示全部楼层
zcllom 发表于 2017-11-10 10:12
在定义时弄成最大空间,后面在调用时量体裁衣不就行了吗?动态内存不注意的话,溢出,泄露了才麻烦。 ...

谢谢,准备这么弄了,程序改动也最小。

出0入0汤圆

发表于 2017-11-11 12:17:07 | 显示全部楼层
单片机这么干,死的快

出0入4汤圆

发表于 2017-11-13 08:38:54 | 显示全部楼层
styleno1 发表于 2017-11-10 13:20
握手,跟你的用法一样。按需分配,复用。

是的,使用内存事先要有个大概大小的判断,这样心里有底。程序稳定是第一位的

出0入0汤圆

发表于 2017-11-13 12:37:48 | 显示全部楼层
单片机不太建议用动态内存,直接按最大空间定义一个数组吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 03:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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