如果在Read之后调用free(),则Read of memory allocation会返回虚假的结果-为什么会发生这种情况?(嵌入式)

如果在Read之后调用free(),则Read of memory allocation会返回虚假的结果-为什么会发生这种情况?(嵌入式),memory,optimization,embedded,realloc,stm32f4discovery,Memory,Optimization,Embedded,Realloc,Stm32f4discovery,在stm32f4上编程观察到一些奇怪的行为: 使用realloc分配数据,realloc大约每秒调用一次ptr=realloc(ptr,sizeof) 将值读取到数据中-已确认:A)数组的索引正确,B)每次将值读取到内存后,数组立即保存正确的值 在读取阵列时,如果在读取后的任何代码中调用free(ptr),则代码无法生成正确的输出(绝大多数情况下输出0)。当未调用free(ptr)时,代码正常工作。在这个例子中,C的顺序性似乎被破坏了 每次将值读入内存后,数组都会立即保存正确的值,而不考虑任何“

在stm32f4上编程观察到一些奇怪的行为:

  • 使用realloc分配数据,realloc大约每秒调用一次<代码>ptr=realloc(ptr,sizeof)
  • 将值读取到数据中-已确认:A)数组的索引正确,B)每次将值读取到内存后,数组立即保存正确的值
  • 在读取阵列时,如果在读取后的任何代码中调用
    free(ptr)
    ,则代码无法生成正确的输出(绝大多数情况下输出0)。当未调用
    free(ptr)
    时,代码正常工作。在这个例子中,C的顺序性似乎被破坏了

    每次将值读入内存后,数组都会立即保存正确的值,而不考虑任何“空闲”调用。使用Realloc是因为该中断被重复调用。在重新定位指针之前,初始化时“随机指针”已设置为NULL。这是stm32f4上的嵌入式程序

    由于缺乏嵌入式c的经验,我只能推测,但可以想象原因可能是错误的优化

    这种行为已知吗?我知道避免malloc ect是最佳做法,但由于此应用程序中可能保存的数据量差异较大,因此需要灵活性

    代码使用全局结构中包含的指针进行malloc。以下代码是违规材料:

    structContainingMemoryPointer storedData;
    numberOfInts = 0;
    
        // ***********Getdata if interrupt conditions state to do so - contained within  interrupt***********
    interrupt {
        if (SpecificInterrupt) {
        numberOfInts++;
        storedData.Arrayptr =
            realloc(storedData.Arrayptr,
                sizeof(int) * storedData.numberOfInts * 2);
    
        // Store the value of actualTemp
        storedData.Arrayptr[storedData.numberOfInts - 1] = actualTemp;
        // Step through the temperature values array and send to USART 
        for (arrayStep = 0; arrayStep < storedData.numberOfTempAllocations;
             arrayStep++) {
            // Convert to string and send
            sprintf(valueString, ":%d", storedData.temperature[arrayStep]);
            USART_puts(USART2, valueString);
        }
    
        }
    
        // ***********free memory*************
        free(storedDataStruct.Arrayptr);
        storedDataStruct.Arrayptr = NULL;
        // End of program, no return from this point to previous points.
    
    structContainingMemoryPointer存储数据;
    numberOfInts=0;
    //*********获取中断条件状态下的数据-包含在中断中***********
    打断{
    如果(特定中断){
    numberOfInts++;
    存储数据=
    realloc(storedData.Arrayptr,
    sizeof(int)*storedData.numberOfInts*2);
    //存储actualTemp的值
    storedData.arraypter[storedData.numberOfInts-1]=实际值;
    //逐步完成温度值数组并发送给USART
    对于(arrayStep=0;arrayStep
    请发布有问题的实际代码。这样我们提供帮助会容易得多。我现在将尝试获取最相关的代码位,谢谢你的回复。
    realloc
    sprintf
    在中断内?不好主意……还有
    USART\u也放了
    。不清楚你的免费()与中断发生的位置相关的调用。这些指令正在重新排序并且在您希望它们被执行之前正在执行,这似乎是合理的。但是正如其他人所指出的,代码中有很多错误的做法,在中断级别上做了大量的工作…malloc、realloc和微控制器上的free?!拜托发布有问题的实际代码。这样我们提供帮助会容易得多。我现在会尝试获取最相关的代码位,谢谢你的回复。
    realloc
    sprintf
    在中断内?不好主意……还有
    USART\u也放了
    。不清楚你的免费()与中断发生的位置相关的调用。这些指令正在重新排序并在您希望它们之前执行是合理的。但正如其他人所指出的,代码中有很多错误的做法,在中断级别上做了大量工作…malloc、realloc和微控制器上的free?!