PIC24上的自由故障

PIC24上的自由故障,c,malloc,free,pic,C,Malloc,Free,Pic,我在运行时分配了两个16位指针,以便将一些长双精度保存到flash(使用Microchip DEE flash仿真库)。代码工作正常,并正确地调用保存的值,但是如果我在malloc()d指针上使用free(),那么代码将在下一次malloc()调用时出错(在另一个函数中,在代码的另一部分中) void readMicCalData(麦克风*pmicred) { /*为2*16位指针分配空间*/ int16_t*templashbuffer=(int16_t*)malloc(sizeof(int1

我在运行时分配了两个16位指针,以便将一些长双精度保存到flash(使用Microchip DEE flash仿真库)。代码工作正常,并正确地调用保存的值,但是如果我在malloc()d指针上使用free(),那么代码将在下一次malloc()调用时出错(在另一个函数中,在代码的另一部分中)

void readMicCalData(麦克风*pmicred)
{
/*为2*16位指针分配空间*/
int16_t*templashbuffer=(int16_t*)malloc(sizeof(int16_t));
int16_t*templashbuffer2=(int16_t*)malloc(sizeof(int16_t));
如果((tempFlashBuffer==NULL)| |(tempFlashBuffer2==NULL)){
debugMessage(“\n\rHEAP>未能为闪存缓冲区分配内存!\n\r”,1);
}
/*通过2字节块递增*/
wc1=RCM\u麦克风\u校准\u开始\u地址;
while(wc1Factor_dB[i4];
/*将指针和增量保存到下一个16位地址,例如0x0D92*/
tempFlashBuffer2=tempFlashBuffer+1;
/*读取前16位值*/
*tempFlashBuffer=DataEERead(wc1);
/*捕捉0xFFFF并设置为零。否则,浮点将变为NaN*/
如果(*tempFlashBuffer==0xFFFF){*tempFlashBuffer=0;}
/*读取接下来的16位值*/
*tempFlashBuffer2=数据读取(wc1+1);
如果(*tempFlashBuffer2==0xFFFF){*tempFlashBuffer2=0;}
/*移动到下一个2*16位内存块*/
wc1=wc1+2;
/*移动到下一个保存的麦克风校准频率*/
i4++;
}
/*空闲内存*/
自由(临时缓冲区);
免费(2);
}
tempFlashBuffer2分配是否可以作为增量计算?因此,我没有释放从malloc()分配的相同指针


如果我不释放这两个指针,代码运行良好,并且没有看到任何segfault(至少短期内不会!)。

传递到
free()
的指针必须是以前调用
malloc()
calloc()
realloc()
返回的指针。这里的情况并非如此,因为您正在更改指针值,从而导致未定义的行为。根据第7.20.3.2节C99标准的自由功能:

free函数导致ptr指向的空间被释放,即生成 可供进一步分配。如果ptr是空指针,则不会发生任何操作否则,如果 参数与calloc、malloc或realloc函数先前返回的指针不匹配,或者如果已通过调用free或realloc释放空间, 行为未定义。


你为什么要在这里胡闹?似乎你只是在进入循环后立即重新分配它们。啊。我想我陷入了困境。你是对的。取消编辑。因为代码与给出的响应相关。
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("\n\rHEAP> Failed to allocate memory for flash buffer!\n\r",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);
}