我在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);
}发布于 2017-04-06 18:27:43
根据它的文档的说法,f_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,但是保留它可能有可行的理由。
https://stackoverflow.com/questions/43262511
复制相似问题