【发布时间】:2017-04-06 17:57:04
【问题描述】:
我在 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);
}
【问题讨论】:
-
我不确定您的问题是什么,但是; 'FILINFO* t_fno; res = f_readdir(dir, t_fno); /* 读取目录项 */' 将未初始化的指针传递给 f_readdir()。如果该指针被取消引用以进行读取或写入,则将导致UB,即。没用的:(
-
@ThingyWotsit Here is my problem。 UB是什么意思?指针未在 f_readdir 或任何需要
fno的地方取消引用 -
UB == "未定义行为"