gpt4 book ai didi

c - 将本地指针传递给函数 FatFs

转载 作者:行者123 更新时间:2023-11-30 14:58:37 30 4
gpt4 key购买 nike

我在 C 中有以下函数:

char* AUDIO_GetFile(FIL* fil, DIR* dir, FILINFO* fno) {
FRESULT res;
res = f_readdir(dir, fno); /* Read a directory item */
if (fno->fname[0] == '\0')} /* End of files */
...
}
...
return &(fno->fname);
}

但是我需要一个临时变量来保留旧值,然后返回&(fno->fname)。我创建了局部变量 FILINFO t_fno ,然后将其传递给函数 res = f_readdir(dir, &t_fno); 一切正常。

但是,如果我想使用 t_fno 作为本地指针,然后将其传递给 f_readdir,我不会获得实际数据,但会在 if (t_fno->fname[0] == ' 上获得一些随机内存读数和程序崩溃\0')}。我还尝试初始化 FILINFO* t_fno = NULL 但这没有帮助。

char* AUDIO_GetFile(FIL* fil, DIR* dir, FILINFO* fno) {
FRESULT res;
FILINFO* t_fno;
res = f_readdir(dir, t_fno); /* Read a directory item */
if (t_fno->fname[0] == '\0')} /* crash */
...
}
...
fno = t_fno;
return &(fno->fname);
}


FRESULT f_readdir (
DIR* dp, /* Pointer to the open directory object */
FILINFO* fno /* Pointer to file information to return */
)
{
FRESULT res;
DEFINE_NAMEBUF;


res = validate(dp); /* Check validity of the object */
if (res == FR_OK) {
if (!fno) {
res = dir_sdi(dp, 0); /* Rewind the directory object */
} else {
INIT_BUF(*dp);
res = dir_read(dp, 0); /* Read an item */
if (res == FR_NO_FILE) { /* Reached end of directory */
dp->sect = 0;
res = FR_OK;
}
if (res == FR_OK) { /* A valid entry is found */
get_fileinfo(dp, fno); /* Get the object information */
res = dir_next(dp, 0); /* Increment index for next */
if (res == FR_NO_FILE) {
dp->sect = 0;
res = FR_OK;
}
}
FREE_BUF();
}
}

LEAVE_FF(dp->fs, res);
}

最佳答案

根据its docsf_readdir() 期望其第二个参数是“指向文件信息结构的指针,用于存储有关读取项的信息”。这与您描述的第一个用法一致,其中您将 t_fno 声明为本地 FILINFO 结构,并传递其地址。它与将 t_fno 声明为指针、使其未初始化并传递其不确定的初始值不一致

第二种方式会产生未定义的行为,这似乎非常合理,因为最仁慈的解释可能是您已指示函数在某个随机位置写入数据。即使这样做成功了,您也无法知道效果是什么,或者当您稍后尝试读回数据时数据是否会不变,或者您稍后是否可以读回它们。 C 不要求也不提供任何理由——它只是声明行为是未定义的。您无法以这种方式安全或可靠地完成这项工作。

正如您所观察到的,初始化指针没有帮助,除非(您没有探索)您将其初始化为指向与 FILINFO 结构兼容的实际存储。指针声明本身仅提供指针,而不提供任何指向的内容。示例:

char* AUDIO_GetFile(FIL* fil, DIR* dir, FILINFO* fno) {
FRESULT res;
FILINFO t_info;
FILINFO* t_fno = &t_info;

res = f_readdir(dir, t_fno); /* Read a directory item */

// ...

在大多数情况下,我不想单独维护 t_fno,但保留它可能有可行的理由。

关于c - 将本地指针传递给函数 FatFs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262511/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com