如果在Read之后调用free(),则Read of memory allocation会返回虚假的结果-为什么会发生这种情况?(嵌入式)
在stm32f4上编程观察到一些奇怪的行为:如果在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的顺序性似乎被破坏了 每次将值读入内存后,数组都会立即保存正确的值,而不考虑任何“
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?!