OpenEdv-开源电子网

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

malloc分配的内存到底存储在哪里

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-9-8
在线时间
9 小时
发表于 2023-8-30 21:23:35 | 显示全部楼层 |阅读模式
1金钱
使用C标准库的malloc进行动态申请内存,网上找了很多资料都说是存在堆区,也就是Heap_Size这个大小这里,但是自己简单写了代码测试,发现地址为什么是存在栈区,各位大神们能否指点一二。

申请了128个字节的内存

申请了128个字节的内存

堆区起始和结束地址,大小是1024

堆区起始和结束地址,大小是1024

串口打印出来的地址

串口打印出来的地址
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6549
金钱
6549
注册时间
2015-8-25
在线时间
1024 小时
发表于 2023-8-31 15:56:29 | 显示全部楼层
不是应该打印p的值吗?p 指针变量,在main函数中定义,肯定在栈区分配,p的地址在栈区。然后你malloc分配的堆区一段空间,将这段空间的地址赋值给了p
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-9-8
在线时间
9 小时
 楼主| 发表于 2023-8-31 22:25:26 | 显示全部楼层
szczyb1314 发表于 2023-8-31 15:56
不是应该打印p的值吗?p 指针变量,在main函数中定义,肯定在栈区分配,p的地址在栈区。然后你malloc分配的 ...

嗯,是的,只是打印信息那里我是写了08x,这个是没有影响的,串口打印的那个图片就是具体的打印地址,这个地址200001028很明显不是在堆区啊,堆区地址是在20000830-20000c30之间啊。
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2021-10-8
在线时间
6 小时
发表于 2023-9-1 09:42:20 | 显示全部楼层
比酷Qwyh 发表于 2023-8-31 22:25
嗯,是的,只是打印信息那里我是写了08x,这个是没有影响的,串口打印的那个图片就是具体的打印地址,这 ...

学习一下指针的用法。

  1. int main()
  2. {
  3.     char *p = NULL;

  4.     p = malloc(128 * sizeof(char));

  5.     // 输出malloc分配的地址,位于堆区
  6.     printf("%p\n", p);

  7.     // 输出局部变量p的地址,位于栈区
  8.     printf("%p\n", &p);
  9. }
复制代码
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6549
金钱
6549
注册时间
2015-8-25
在线时间
1024 小时
发表于 2023-9-1 09:44:55 | 显示全部楼层
本帖最后由 szczyb1314 于 2023-9-1 09:53 编辑
比酷Qwyh 发表于 2023-8-31 22:25
嗯,是的,只是打印信息那里我是写了08x,这个是没有影响的,串口打印的那个图片就是具体的打印地址,这 ...

打印p的值
printf(“0x%08X”,p);
你的这个说法,你应该还是没有搞明白,指针变量(p),指针变量的值(存放你malloc分配的堆空间的地址),指针变量自己的地址(p的地址,因为在main定义,肯定分配在栈区),这些概念

int *p;定义指针变量,它是个变量,有它自己本身的地址,用来存储值(内容比较特殊,某个int变量的地址,一般一个u32类型的数字)
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

75

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2021-2-5
在线时间
135 小时
发表于 2023-9-1 10:50:36 | 显示全部楼层
最近研究启动文件的时候,有一点是这么讲的,就是说为了加快中断响应的访问速度,会把中断向量表搬移到内存的0x20000000起始地址处,因为内存的访问速度会比FLASH快,但是从map文件上看不出来这个操作,因为这个操作是硬件层的,STM32大多数系列的中断向量表搬移到内存中大概会占用256个字节,这样的话,堆栈就会顺着往后移,答案仅供参考哈
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2023-9-2 16:01:14 | 显示全部楼层
去看看链接脚本,stm32 默认的链接脚本中,从ram的起始地址开始存放的分别是data、bss ,接着就是堆,偏移堆的大小,再加上栈的大小,就是栈顶


statck栈顶sp
栈底
heap
bss
data

回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2023-9-3 11:01:48 | 显示全部楼层
不可能是放在栈的, 如果是就乱套了。
改成这样吧 printf("%n\n", (int)p);
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 18:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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