C中的自由指针数组



我使用C在eclipse环境中工作。为了简单地解释,我有一个简单的结构来定义我的项目中需要的一些元素:

typedef struct adc adc_def;
struct adc {
SPI_HandleTypeDef *spi_hal;
//Adresse de l'esclave avec qui communiquer
uint8_t numero_adc;
registres_adc config;
};

我还有一个实例化新结构(前面声明的结构(的函数。我需要其中的4个,我将其存储在一个全局数组中:

adc_def* adc_new(SPI_HandleTypeDef *param_spi_hal, uint8_t numero_adc) {
adc_def *adc = NULL;
registres_adc tmp_config;
adc_status_t status_adc;
if ((NULL != param_spi_hal) && numero_adc <= ADC_MAX) {
if (NULL != (adc = malloc(sizeof(adc_def)))) {

adc->spi_hal = param_spi_hal;
adc->numero_adc = numero_adc;
adc->config.configuration = DEFAULT_CONF;
//Copie des tab en const pour les passer dans la fonction
memcpy(adc->config.hpf, HPF, 2);
memcpy(adc->config.fsc, FSC, 3);
memcpy(adc->config.ofc, OFC, 3);
if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
///////////
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}
}
}
return adc;
}

一旦我进入主程序,我就会将其中4个存储在一个全局数组中:

SPI_HandleTypeDef hspi1;
adc_def *adc_present[4];

void re_init(){
for (int z = 0; z < 4; z++) {
free(adc_present[z]);
adc_present[z] = NULL;
}
for (int a = 0; a < 4; a++) {
adc_present[a] = adc_new(&hspi1, a+1);
}
}
int main(void) {
for (int a = 0; a < 4; a++) {
adc_present[a] = adc_new(&hspi1, a+1);
}
re_init();
}

在我的程序中,我需要释放存储在adc_present中的所有结构,以便再次创建其他adc_def结构元素。因此,我做这个代码:

这段代码似乎引发了内存泄漏和错误,尽管我以前使用过free,但我无法在这个选项卡中重新完善。我是不是错过了什么?选项卡没有在此处正确释放?我有一组动态分配的指针,在重新生效之前我会释放它们,我不理解

这个代码中有一个问题:

if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
///////////
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}

如果对adc_stopCont()的调用失败,则使用将adc设置为NULL

adc = NULL;

但无论如何都要调用adc_setConfig()

if (HAL_OK != adc_setConfig(adc, adc->config)) {

如果adcNULL,则会失败,因为adc->config将尝试取消引用NULL指针。

这会更好:

if (HAL_OK != adc_stopCont(adc)) {
free(adc);
adc = NULL;
}
else if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
adc = NULL;
}

if (HAL_OK != adc_stopCont(adc)) {
free(adc);
return(NULL);
}
if (HAL_OK != adc_setConfig(adc, adc->config)) {
free(adc);
return(NULL);
}

相关内容

  • 没有找到相关文章

最新更新