高级会员

- 积分
- 747
- 金钱
- 747
- 注册时间
- 2018-9-1
- 在线时间
- 177 小时
|
发表于 2020-6-17 03:33:43
|
显示全部楼层
明白你的意思,但是不要这么说。不是malloc了一个指针,而是malloc申请了一块内存,赋值给了一个指针。而且说指针p1,不要说指针*p1。
通过动态内存分配的内存的地址来求分配内存大小,通常情况下没有办法,因为不知道具体分配方案,也没有C库函数做这个事。
但是能够具体到malloc源码,你的部分需求是能做的。
从heap4_.c 源码中可以看到动态内存是通过 BlockLink_t 结构来保存分配内存信息的
那么参考源码则可得到p1指向的动态内存大小:
- unsigned int p1_size = (((BlockLink_t *)( (uint8_t*)p1 - xHeapStructSize ))->xBlockSize) &~xBlockAllocatedBit;
复制代码
因为BlockLink_t 结构体或变量都是heap4_.c中的变量,外部不可见,所以你的用户源码中不能直接用。要么在heap4_.c定义一个函数返回大小,要么把这些变量/类型定义拷贝到你自己的函数中。
(注意xBlockAllocatedBit变量在初始化时会被赋值为其它值)
通过这个方法,得到的并不是申请内存时的大小,而是按内存方案中的字节对齐后的实际大小。
简而言之就是得到p1_size大于等于申请的size,小于(size+8-(size&7))。
如果原来通过p1初始化/修改过所有内容为非0值,那么很容易判断出分配时的大小,因为可能的多余的内容始终为0,
如果没有的话就不知道精确大小了。
那么使用p1_size可解决部分需求:
单纯清零:用memset/for循环赋值,也不会有啥问题。
复制:用memcpy 将p1 复制给p2
|
|