【发布时间】:2021-09-08 23:00:35
【问题描述】:
我有一个关于数据缓冲区指针的问题,我不知道如何在 Google 上搜索这个问题,因为我不知道它可能被称为什么。所以...
我有一个函数,它采用结构 PCA9745 并使用函数输入配置它的一些参数,如下所示。我关心的是数组指针......当函数 _PCA9745_Configure() 完成时,在函数返回后是否释放数组(到缓冲区),从而使数组指针变得无用,因为它可能会得到重写了吗?
我想要一种方法来创建数组引用,一旦函数返回就不会过时,而无需在 main.c 中声明数组以隐藏一些丑陋并使其更加用户友好。
PCA9745_io.c
void _PCA9745_Configure(PCA9745 *p, float r_ext, uint16_t num_dev){
p->r_ext = r_ext;
p->num_dev = num_dev;
uint8_t instr_buffer[num_dev];
uint8_t data_buffer[num_dev];
uint8_t rx_buffer[num_dev];
p->instr_buffer = &instr_buffer;
p->data_buffer = &data_buffer;
p->rx_buffer = &rx_buffer;
}
PCA9745 结构
typedef struct {
SPI_HandleTypeDef *hspi;
GPIO_TypeDef *gpio_port_nCS;
uint16_t gpio_pin_nCS;
GPIO_TypeDef *gpio_port_nOE;
uint16_t gpio_pin_nOE;
//Must include for PCA9745.c to compile
float r_ext; //External Resistor value
uint16_t num_dev; //number of devices
uint8_t *instr_buffer[];
uint8_t *data_buffer[];
uint8_t *rx_buffer[];
} PCA9745;
main.c
PCA9745 p = Init_PCA9745(&hspi1, nCS_GPIO_Port, nCS_Pin, nOE_GPIO_Port, nOE_Pin);
_PCA9745_Configure(&p, 3600.0f, 1);
【问题讨论】:
-
是的,它们被释放是因为它们是本地的。您的平台是否支持动态分配(
malloc()等)? -
_PCA9745_Configure()函数不正确,因为它的指针成员包含局部变量的地址,当您从函数返回时,这些局部变量将终止生命。您也有不匹配的间接,因为(我认为,那些只是代码片段)成员uint8_t *instr_buffer[];应该是uint8_t *instr_buffer;如果您不希望引用过时,请在您之前使用malloc和free它们freestruct. -
您的
PCA9745不是有效的 C,因为它最后有三个灵活的数组成员。只有最后一个成员被允许成为灵活的数组成员(并且仅当它不是结构的唯一成员时)。 -
@IanAbbott IMO 它们不应该是指针数组,而是
uint8_t *instr_buffer等评论。间接级别不匹配。 -
@WeatherVane TBH,很难在代码中找到任何没有错误的东西!