OpenEdv-开源电子网

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

内存管理中的sprintf函数的问题

[复制链接]

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
发表于 2022-6-5 22:05:25 | 显示全部楼层 |阅读模式
1金钱
sprintf((char*)p,"Memory Malloc Test%03d",i)  这个i的值是随机的吗?为什么每次值都不一样?

最佳答案

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

sprintf((char*)p,"Memory Malloc Test%03d",i); %03d处用i替代。例如,i=3时保存到p这个地址的内容就是“Memory Malloc Test003”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2018-8-21
在线时间
10 小时
发表于 2022-6-5 22:05:26 | 显示全部楼层
sprintf((char*)p,"Memory Malloc Test%03d",i); %03d处用i替代。例如,i=3时保存到p这个地址的内容就是“Memory Malloc Test003”
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2022-6-6 09:51:52 | 显示全部楼层
这个i是在哪里赋值的
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-6-6 11:38:09 | 显示全部楼层
这不是和printf差不多吗 字符串格式化
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-6 22:02:43 | 显示全部楼层
wxTB99A9f0 发表于 2022-6-6 13:21
sprintf((char*)p,"Memory Malloc Test%03d",i); %03d处用i替代。例如,i=3时保存到p这个地址的内容就是“M ...

我这个试过,但是读出来的值就变了。申请一块内存写入,然后读出来i的值就是随机的。
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-6 22:04:43 | 显示全部楼层
GJJ1999 发表于 2022-6-6 09:51
这个i是在哪里赋值的

直接用的正点原子的demo测试的,i是一个局部变量。设置静态的也会变成随机数。
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-6 22:05:42 | 显示全部楼层
wxTB99A9f0 发表于 2022-6-6 13:21
sprintf((char*)p,"Memory Malloc Test%03d",i); %03d处用i替代。例如,i=3时保存到p这个地址的内容就是“M ...

int main(void)
{         
        u8 key;                 
          static u8 i=10;            
        u8 *p=0;
        u8 *tp=0;
        u8 paddr[18];                                //存放P Addr:+p地址的ASCII值
  
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD   
        my_mem_init(SRAMIN);                //初始化内部内存池
        POINT_COLOR=RED;                        //设置字体为红色
        LCD_ShowString(30,50,200,16,16,"ELITE STM32F103 ^_^");       
        LCD_ShowString(30,70,200,16,16,"MALLOC TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/20");
        LCD_ShowString(30,130,200,16,16,"KEY0:Malloc  KEY1:Free");
        LCD_ShowString(30,150,200,16,16,"KEY_UP:Write");

        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(30,170,200,16,16,"SRAMIN");
        LCD_ShowString(30,190,200,16,16,"SRAMIN USED:   %");  
          while(1)
        {       
                key=KEY_Scan(0);                        //不支持连按       
                switch(key)
                {
                        case 0:                                        //没有按键按下       
                                break;
                        case KEY0_PRES:                        //KEY0按下
                                p=mymalloc(SRAMIN,2048);//申请2K字节
                                if(p!=NULL)sprintf((char*)p,"Memory Malloc Test%03d",i);//向p写入一些内容
                                break;
                        case KEY1_PRES:                        //KEY1按下
                                myfree(SRAMIN,p);        //释放内存
                                p=0;                                //指向空地址          
                                break;
                        case WKUP_PRES:                        //KEY UP按下
                                if(p!=NULL)
                                {
                                        sprintf((char*)p,"Memory Malloc Test%03d",i);//更新显示内容          
                                        LCD_ShowString(30,250,200,16,16,p);                         //显示P的内容
                                }
                                break;
                }
                if(tp!=p)
                {
                        tp=p;
                        sprintf((char*)paddr,"P Addr:0X%08X",(u32)tp);
                        LCD_ShowString(30,230,200,16,16,paddr);        //显示p的地址
                        if(p)LCD_ShowString(30,250,200,16,16,p);//显示P的内容
                    else LCD_Fill(30,250,239,266,WHITE);        //p=0,清除显示
                }
                delay_ms(10);   
                i++;
                if((i%20)==0)//DS0闪烁.
                {
                        LCD_ShowNum(30+96,190,my_mem_perused(SRAMIN),3,16);//显示内部内存使用率
                        LED0=!LED0;
                }
        }          
}
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-6 22:06:09 | 显示全部楼层
GJJ1999 发表于 2022-6-6 09:51
这个i是在哪里赋值的

int main(void)
{         
        u8 key;                 
          static u8 i=10;            
        u8 *p=0;
        u8 *tp=0;
        u8 paddr[18];                                //存放P Addr:+p地址的ASCII值
  
        delay_init();                     //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        LCD_Init();                                           //初始化LCD   
        my_mem_init(SRAMIN);                //初始化内部内存池
        POINT_COLOR=RED;                        //设置字体为红色
        LCD_ShowString(30,50,200,16,16,"ELITE STM32F103 ^_^");       
        LCD_ShowString(30,70,200,16,16,"MALLOC TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/20");
        LCD_ShowString(30,130,200,16,16,"KEY0:Malloc  KEY1:Free");
        LCD_ShowString(30,150,200,16,16,"KEY_UP:Write");

        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(30,170,200,16,16,"SRAMIN");
        LCD_ShowString(30,190,200,16,16,"SRAMIN USED:   %");  
          while(1)
        {       
                key=KEY_Scan(0);                        //不支持连按       
                switch(key)
                {
                        case 0:                                        //没有按键按下       
                                break;
                        case KEY0_PRES:                        //KEY0按下
                                p=mymalloc(SRAMIN,2048);//申请2K字节
                                if(p!=NULL)sprintf((char*)p,"Memory Malloc Test%03d",i);//向p写入一些内容
                                break;
                        case KEY1_PRES:                        //KEY1按下
                                myfree(SRAMIN,p);        //释放内存
                                p=0;                                //指向空地址          
                                break;
                        case WKUP_PRES:                        //KEY UP按下
                                if(p!=NULL)
                                {
                                        sprintf((char*)p,"Memory Malloc Test%03d",i);//更新显示内容          
                                        LCD_ShowString(30,250,200,16,16,p);                         //显示P的内容
                                }
                                break;
                }
                if(tp!=p)
                {
                        tp=p;
                        sprintf((char*)paddr,"P Addr:0X%08X",(u32)tp);
                        LCD_ShowString(30,230,200,16,16,paddr);        //显示p的地址
                        if(p)LCD_ShowString(30,250,200,16,16,p);//显示P的内容
                    else LCD_Fill(30,250,239,266,WHITE);        //p=0,清除显示
                }
                delay_ms(10);   
                i++;
                if((i%20)==0)//DS0闪烁.
                {
                        LCD_ShowNum(30+96,190,my_mem_perused(SRAMIN),3,16);//显示内部内存使用率
                        LED0=!LED0;
                }
        }          
}
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-8 01:36:38 | 显示全部楼层
啥情况?例如,i=3时保存到p这个地址的内容就是“Memory Malloc Test003”但是重新读出来就是随机的值啊!!!!!!!!!!!
回复

使用道具 举报

4

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
金钱
1646
注册时间
2021-5-13
在线时间
112 小时
 楼主| 发表于 2022-6-8 01:45:26 | 显示全部楼层
wxTB99A9f0 发表于 2022-6-5 22:05
sprintf((char*)p,"Memory Malloc Test%03d",i); %03d处用i替代。例如,i=3时保存到p这个地址的内容就是“M ...

根本就不是这样的
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2018-8-21
在线时间
10 小时
发表于 2022-6-8 10:01:57 | 显示全部楼层
u8 *p和u8 *tp是指针变量,初始化的时候要指向一个地址,你这里初始化u8 *p =0;是不对的,所以程序中你的指针乱指,这样肯定是随机的啊
回复

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2019-12-6
在线时间
149 小时
发表于 2024-4-8 17:00:41 | 显示全部楼层
看代码啊,你先了解一下一个变量的生存期在那里,下面有个i++,while一直在循环,你没操作按键的时候,i一直在变化,所以%03d怎么不是个随机值
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 05:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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