繁体   English   中英

C 中的自由指针数组

[英]Free array of pointers in 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 结构体元素。 因此,我为此执行此代码:

看起来这段代码会引起内存泄漏和错误,即使我以前使用过免费,我也无法在此选项卡中重新生效。 我错过了什么吗? 标签在这里没有被正确释放? 我有一个动态分配的指针数组,在重新影响它们之前我释放了它们,我不明白

一个问题是在这段代码中:

        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);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM