我在运行时分配了两个16位指针,以便将一些长double保存到flash中(使用Microchip DEE flash仿真库)。代码工作正常,并正确地调用保存的值,但如果我在malloc()'d指针上使用free(),那么代码在下一次调用malloc()时(在另一个函数中,在代码的另一部分中)会出现分段错误。
void readMicCalData(Microphone* pMicRead)
{
/* Allocate space for 2*16-bit pointers */
int16_t* tempFlashBuffer = (int16_t*)malloc(sizeof(int16_t));
int16_t* tempFlashBuffer2 = (int16_t*)malloc(sizeof(int16_t));
if ((tempFlashBuffer == NULL) || (tempFlashBuffer2 == NULL)) {
debugMessage("nrHEAP> Failed to allocate memory for flash buffer!nr",1);
}
/* Increment through 2-byte blocks */
wc1 = RCM_MIC_CAL_START_ADDRESS;
while(wc1 < RCM_MIC_CAL_END_ADDRESS) {
/* Init pointer to lowest 16-bits of 32-bit value e.g. 0x0D90 */
tempFlashBuffer = (int16_t*) &pMicRead->Factor_dB[i4];
/* Save pointer and increment to next 16-bit address e.g. 0x0D92 */
tempFlashBuffer2 = tempFlashBuffer + 1;
/* Read first 16-bit value */
*tempFlashBuffer = DataEERead(wc1);
/* Catch 0xFFFF and set to zero. Otherwise the float becomes NaN. */
if (*tempFlashBuffer == 0xFFFF) { *tempFlashBuffer = 0; }
/* Read next 16-bits of value */
*tempFlashBuffer2 = DataEERead(wc1 + 1);
if (*tempFlashBuffer2 == 0xFFFF) { *tempFlashBuffer2 = 0; }
/* Move to next 2*16-bit block of memory */
wc1 = wc1 + 2;
/* Move to next saved mic. cal. frequency */
i4++;
}
/* Free memory */
free(tempFlashBuffer);
free(tempFlashBuffer2);
}
tempFlashBuffer2赋值可以作为增量计数吗?因此,我不是自由()从malloc()分配相同的指针?
如果我不free()这两个指针,代码运行良好,不会看到任何段错误(至少在短期内不会!)。
传递给free()
的指针必须是之前调用malloc()
, calloc()
或realloc()
返回的指针。这不是这里的情况,因为您正在更改指针值,导致未定义的行为。C99标准的自由函数:
free函数导致ptr所指向的空间被释放,即释放可供进一步分配。如果ptr是空指针,则不发生任何操作。否则,如果该参数与先前由calloc、malloc或realloc函数返回的指针不匹配,或者如果空间已通过调用free或realloc被释放,