野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8792|回复: 15

关于FATFS文件系统中文件句柄的问题,望指教

[复制链接]
发表于 2017-7-25 10:59:20 | 显示全部楼层 |阅读模式
文件的任何操作都是需要文件句柄
在学习FATFS过程中,根据视频在敲代码,然后在文件句柄那块出了个问题。
我在敲代码时,根据我以前的相关知识,使用的是FILE *fp;声明的句柄,然后视频中用的是FILE fp;
在后面的使用中也就出现了问题,我是直接在函数中就用fp,视频中用的是&fp;最后我的代码是错误的,想了一晚上,没有搞懂,请指教

回复

使用道具 举报

 楼主| 发表于 2017-7-25 11:00:10 | 显示全部楼层
就是有谁能帮忙指出一下,这两个有什么区别么,谢谢
回复 支持 反对

使用道具 举报

发表于 2017-8-3 16:07:30 | 显示全部楼层
那个定义的是结构体    你说的是指针
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-5 10:21:25 | 显示全部楼层
shao1523 发表于 2017-8-3 16:07
那个定义的是结构体    你说的是指针

对结构体取地址也就是指针呀
那我直接用指针操作不行么,还是没搞懂
回复 支持 反对

使用道具 举报

发表于 2017-8-6 21:38:47 | 显示全部楼层
让我来告诉你吧!!!
FILE fp定义了一个变量,然后在其它函数调用的时候通过&fp将变量的地址传递出去,接收的函数就会处理这个地址上的变量

FILE *fp定义了一个指针,这时fp=0不指向任何的FILE类型变量,然后你在其它函数调用的时候将fp传递出去,接收的函数就会处理这个地址上的变量,当然了这个地址上是没有FILE类型变量的,所以就错了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 23:49:18 来自手机 | 显示全部楼层
飔箣 发表于 2017-8-6 21:38
让我来告诉你吧!!!
FILE fp定义了一个变量,然后在其它函数调用的时候通过&fp将变量的地址传递出去,接 ...

前一句我还能明白,后面的就不清楚了,如果说定义了一个file类型的指针,那么这个指针所指向的空间那一定是一个file类型的,其中包括这个指针指向的空间长度是file类型的,还有file类型所包括的一些成员,fopen函数就是将一个文件打开,然后再将一个文件头指针传过来,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 23:50:39 来自手机 | 显示全部楼层
飔箣 发表于 2017-8-6 21:38
让我来告诉你吧!!!
FILE fp定义了一个变量,然后在其它函数调用的时候通过&fp将变量的地址传递出去,接 ...

而且定义一个file类型的指针,产量的值不一定是0,而是一个随机值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-7 23:55:46 来自手机 | 显示全部楼层
fishfly 发表于 2017-8-7 23:49
前一句我还能明白,后面的就不清楚了,如果说定义了一个file类型的指针,那么这个指针所指向的空间那一定 ...

我的这个意思就是指针所指向的空间是跟数据类型所相关的,也就是说你定义的指针所指向的地址首先是一个随机值,然后从那个地址开始,后面数据类型个字节是被类似征用的,你将你所要书写的数据写入这个指针所指向的空间应该是可以的
回复 支持 反对

使用道具 举报

发表于 2017-8-8 20:52:44 | 显示全部楼层
fishfly 发表于 2017-8-7 23:55
我的这个意思就是指针所指向的空间是跟数据类型所相关的,也就是说你定义的指针所指向的地址首先是一个随 ...

首先你定义了一个FILE *fp,这是一个指针变量,没有初值,所以 keil 在编译的时候把它归为为初始化变量ZI类型,这种类型的变量
在程序运行的时候全部都会初始化为0,所以你在直接调用它的时候相当于默认了在地址0x00000000的地方存在一个FILE类型的变
量,但是显然那里是没有的,当你使用fopen函数的时候,指针fp传递给fopen函数,fopen函数会将自己得到的指针信息存储在fp指
向的地方,也就是物理地址0x00000000,并且向后连续占用几十个字节的空间用来存放信息,不知道你有没有注意到stm32的内存
映射,在0x20000000之后才是我们可以操作的内存空间,之前的地址不属于SRAM
无标题.png 内存映射.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 22:57:05 | 显示全部楼层
飔箣 发表于 2017-8-8 20:52
首先你定义了一个FILE *fp,这是一个指针变量,没有初值,所以 keil 在编译的时候把它归为为初始化变量ZI ...

我也想到了这个可能是地址访问越线,但是不知道为什么定义的FILE *f的值是一个0,按理说应该只有当在全局变量的时候才会出现0.局部变量是随机值,这个是不会错的吧,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 22:59:11 | 显示全部楼层
飔箣 发表于 2017-8-8 20:52
首先你定义了一个FILE *fp,这是一个指针变量,没有初值,所以 keil 在编译的时候把它归为为初始化变量ZI ...

这个应该是你写的一个测试程序吧,你看你的变量设置的是局部变量,那按照你那样说,只要申请了一个指针,32就会把他认为0地址?那指针不疚不能用了么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-8 23:00:38 | 显示全部楼层
飔箣 发表于 2017-8-8 20:52
首先你定义了一个FILE *fp,这是一个指针变量,没有初值,所以 keil 在编译的时候把它归为为初始化变量ZI ...

或者说怎样定义一个指针才不会出现错误,
回复 支持 反对

使用道具 举报

发表于 2017-8-8 23:39:59 | 显示全部楼层
fishfly 发表于 2017-8-8 23:00
或者说怎样定义一个指针才不会出现错误,

按理来说,定义了一个变量,只要没有给初值,都是0,你如果想要不出错,可以对指针赋值,给个有效的地址就行了,当然,从这个地址开始的连续内存空间要能够放得下FILE类型的变量,最简单的办法就是使用FILE fp这种定义变量的方式申请内存空间,这样的话也就没必要用你的办法了,采用 &fp 的方式更好一些
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-9 12:39:18 | 显示全部楼层
飔箣 发表于 2017-8-8 23:39
按理来说,定义了一个变量,只要没有给初值,都是0,你如果想要不出错,可以对指针赋值,给个有效的地址 ...

嗯呢 大概知道是怎么回事了,指针还是没玩转,以后注意一下就行了,十分感谢你的帮助,
回复 支持 反对

使用道具 举报

发表于 2017-8-16 21:41:37 | 显示全部楼层
你如果用FILE *fp的话,需要给fp指针分配空间,FILE *fp = (类型 *)malloc(sizeof(类型) * 分配空间大小);就可以用了,
回复 支持 反对

使用道具 举报

发表于 2017-8-18 15:46:14 | 显示全部楼层
多少明白了一点
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 00:08 , Processed in 0.079611 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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