我正在使用一个代码库,它使用Chan的FatFS库,可能是使用CubeMX代码生成器开发的.我可以看到下面给出的代码.它在STM32 user manual UM1721中也有描述

struct 的定义如下:

typedef struct
{ 
  uint8_t                 is_initialized[_VOLUMES];
  Diskio_drvTypeDef       *drv[_VOLUMES];
  __IO uint8_t            nbr;

}Disk_drvTypeDef;

disk是一个全局变量,定义为:

Disk_drvTypeDef  disk = {0};

函数的定义如下:

uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path)
{
  uint8_t ret = 1;
  uint8_t DiskNum = 0;
  if(disk.nbr <= _VOLUMES)
  {
    disk.is_initialized[disk.nbr] = 0;
    disk.drv[disk.nbr] = drv;  
    DiskNum = disk.nbr++;
    path[0] = DiskNum + '0';
    path[1] = ':';
    path[2] = '/';
    path[3] = 0;
    ret = 0;
  }
  return ret;
}

我的问题是,当disk.nbr == _VOLUMES,我调用FATFS_LinkDriver函数时,会发生什么.它不会试着把drv放在disk.drv[_VOLUMES]中吗?但disk.drv的尺寸是_VOLUMES.那么,最大指数不应该比这个数字小1吗?我是不是遗漏了什么?

推荐答案

此代码在该行中调用未定义的行为:

disk.drv[disk.nbr] = drv;  

disk.nbr == _VOLUMES的时候.

STM32 FATFS用户手册(Um1721)中的代码正确吗?

不,不是的.一般备注-不能保证文档中的代码是正确的.

C++相关问答推荐

C语言中字符数组声明中的标准

如何创建由符号组成的垂直结果图形?

Malloc(sizeof(char[Length]))是否不正确?

为什么内核使用扩展到前后相同的宏定义?

从纯C中访问通用项对话框

C语言编译阶段与翻译阶段的关系

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

从TCP连接启动UDP(C套接字)

使用nmake for程序比Hello World稍微复杂一些

C整型和_泛型.哪些类型是兼容的?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

赋值两侧的后置增量,字符指针

如何解释数组中的*(ptr)和*(ptr+2)?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

在带中断的循环缓冲区中使用 易失性

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

设置具有非零终止字符串的大整数