OpenEdv-开源电子网

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

使用数组和使用指针奇怪的问题

[复制链接]

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
发表于 2023-7-26 16:42:37 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 shenqihao 于 2023-7-27 13:25 编辑

使用fatfs做个简单的数据库。仿真调试时候发现,原先对指针进行操作,加了断点仿真运行正常,实际测试运行错误。
后来改为数组就能正常运行,大家遇到过这种情况吗,可能什么原因?补充下,芯片是H750VBt6补充,指针的操作,文件名提取流程如下:

复制代码
  1. char* filename
  2. filename=mymalloc(SRAMIN,LineMinByte);
  3. filename="0:ParticleFile/MeasureData";
  4. strcat(filename,DataChangeNumberToString_C(Particle1));//DataChangeNumberToString_C是把数字变为指针返回
  5. strcat(filename,“.txt”);
  6. //存储操作

  7. myfree(SRAMIN,filename);
复制代码

  1. //写入一串字符串
  2. //n,写入的指定行数
  3. //dw,写入一串字符串
  4. void FileStoreWriteLine(u32 n,u8* dw)
  5. {
  6.         //char* filename;//使用指针操作仿真加断点可以现实,实测不行,改用数组实现
  7.         u32 fsize;
  8.         u16 FileNum=0;
  9.         u32 d;

  10.         FileNum=n/FileMaxLine;
  11.         d=n%FileMaxLine;
  12.         //文件名
  13.         FileNameArr[26]=FileNum/100+'0';
  14.         FileNameArr[27]=(FileNum/10)%10+'0';
  15.         FileNameArr[28]=(FileNum)%10+'0';
  16.         FileNameArr[29]='.';
  17.         FileNameArr[30]='t';
  18.         FileNameArr[31]='x';
  19.         FileNameArr[32]='t';
  20.         
  21.         mf_mkdir("0:ParticleFile");        //如果文件夹已经存在,就不创建.如果不存在就创建新的文件夹.
  22.         mf_open((u8*)FileNameArr,FA_OPEN_ALWAYS|FA_WRITE);//打开/创建文件
  23.         //mf_open("0:ParticleFile/MeasureData0.txt",FA_OPEN_ALWAYS|FA_WRITE);//打开/创建文件
  24.         fsize=(d-1)*LineMinByte;
  25.         mf_lseek(fsize);
  26.         //mf_puts(dw);
  27.         mf_write(dw,LineMinByte-2);
  28.         mf_write("\r\n",2);
  29.         mf_close();//关闭文件        
  30.         //存储行数
  31.         FileStoreLine(n);
  32. }
复制代码
  1. //读取一串字符串
  2. //n,读取的指定函数
  3. //dr,读取一串字符串
  4. //0,正确
  5. //1,错误
  6. u8 FileStoreReadLine(u32 n,u8* dr)
  7. {
  8.         u32 fsize;
  9.         u32 r_size;//读取的大小
  10.         u16 FileNum=0;
  11.         
  12.         FileNum=n/FileMaxLine;
  13.         n=n%FileMaxLine;
  14.         //文件名
  15.         FileNameArr[26]=FileNum/100+'0';
  16.         FileNameArr[27]=(FileNum/10)%10+'0';
  17.         FileNameArr[28]=(FileNum)%10+'0';
  18.         FileNameArr[29]='.';
  19.         FileNameArr[30]='t';
  20.         FileNameArr[31]='x';
  21.         FileNameArr[32]='t';

  22.         mf_mkdir("0:ParticleFile");        //如果文件夹已经存在,就不创建.如果不存在就创建新的文件夹.
  23.         mf_open((u8*)FileNameArr,FA_OPEN_ALWAYS|FA_READ);//打开/创建文件

  24.         r_size=mf_size();//读取文件大小
  25.         fsize=(n-1)*LineMinByte;
  26.         if(r_size<=fsize)//文件大小小于要读取的尺寸
  27.         {
  28.                 mf_close();//关闭文件        
  29.                 return 1;
  30.         }
  31.         
  32.         //mf_tell();//获取当前指针位置
  33.         mf_lseek(fsize);//移动指针
  34.         //mf_gets(LineMinByte);
  35.         f_gets((TCHAR*)dr,LineMinByte,file);
  36.         //mf_read(LineMinByte);
  37.         
  38.         mf_close();//关闭文件        
  39.         return 0;
  40. }
复制代码




最佳答案

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

指针写法写错了, 1,filename="0articleFile/MeasureData";这步操作会导致指针filename指向字符串。并不是把字符串保存到申请的内存里面。 1,后面在释放内存时,也是等于没有释放,因为指针变量filename所存放的地址不是你申请内存的首地址了。
做一个相信自己的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
600
金钱
600
注册时间
2019-3-27
在线时间
142 小时
发表于 2023-7-26 16:42:38 | 显示全部楼层
shenqihao 发表于 2023-7-27 13:25
char* filename
filename=mymalloc(SRAMIN,LineMinByte);
filename="0articleFile/MeasureData";

指针写法写错了,
1,filename="0articleFile/MeasureData";这步操作会导致指针filename指向字符串。并不是把字符串保存到申请的内存里面。
1,后面在释放内存时,也是等于没有释放,因为指针变量filename所存放的地址不是你申请内存的首地址了。

回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-7-26 16:55:06 | 显示全部楼层
指针怎么写的 也发出来看看
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14286
金钱
14286
注册时间
2018-8-3
在线时间
1147 小时
发表于 2023-7-27 09:04:24 | 显示全部楼层
是不是没申请内存。。
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2023-7-27 13:25:58 | 显示全部楼层
远命 发表于 2023-7-26 16:55
指针怎么写的 也发出来看看

char* filename
filename=mymalloc(SRAMIN,LineMinByte);
filename="0articleFile/MeasureData";
strcat(filename,DataChangeNumberToString_C(Particle1));//DataChangeNumberToString_C是把数字变为指针返回
strcat(filename,“.txt”);
//存储操作

myfree(SRAMIN,filename);
做一个相信自己的人
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2023-7-27 13:27:03 | 显示全部楼层
翼行园子 发表于 2023-7-27 09:04
是不是没申请内存。。

申请了,指针的流程也贴出来了。
做一个相信自己的人
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14286
金钱
14286
注册时间
2018-8-3
在线时间
1147 小时
发表于 2023-7-27 16:20:15 | 显示全部楼层
shenqihao 发表于 2023-7-27 13:27
申请了,指针的流程也贴出来了。

仿真可以正常看到指针指向的数据吗
啊哈~加油!!
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2023-7-28 08:57:59 | 显示全部楼层
翼行园子 发表于 2023-7-27 16:20
仿真可以正常看到指针指向的数据吗

可以。
仿真加断点看数据,运行结果是正确的。
实际运行出问题,改成数组却没问题了,所以感觉奇怪。
做一个相信自己的人
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-7-28 08:58:07 | 显示全部楼层
看看是不是堆空间设置太小导致的
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2023-7-28 13:44:13 | 显示全部楼层
远命 发表于 2023-7-28 08:58
看看是不是堆空间设置太小导致的

申请的空间和数组一样大,应该不是。
做一个相信自己的人
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-7-29 10:55:24 | 显示全部楼层
shenqihao 发表于 2023-7-28 13:44
申请的空间和数组一样大,应该不是。

你申请的空间和数组空间是两码事
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2023-7-31 09:21:31 | 显示全部楼层
远命 发表于 2023-7-29 10:55
你申请的空间和数组空间是两码事

你申请的空间和数组空间是两码事
没懂,不都是在内存中得到的一定长度的连续内存吗?
数组大小和申请的空间是256字节,启动文件用的正点原子的,栈0x800,堆是0。
做一个相信自己的人
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2023-7-31 10:24:43 | 显示全部楼层
shenqihao 发表于 2023-7-31 09:21
你申请的空间和数组空间是两码事
没懂,不都是在内存中得到的一定长度的连续内存吗?
数组大小和申请的 ...

你把堆空间写高点就好了 具体原因百度吧 我解释的并不一定全 内存是分开管理的
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-7-6
在线时间
16 小时
发表于 2023-12-13 11:44:56 | 显示全部楼层
malloc是在堆区分配内存,这个mymalloc就不知道了,建议加大堆区空间试试,不过一般单片机不用malloc,因为要做内存管理
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2382
金钱
2382
注册时间
2012-11-22
在线时间
403 小时
发表于 2023-12-14 10:57:45 | 显示全部楼层
本帖最后由 冰封嗜魔 于 2023-12-14 11:00 编辑

filename="0articleFile/MeasureData";

这里你已经把指针指向一个字符串了。

你想做的是赋值,但是其实修改了指针的值。


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 02:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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