在释放内存时,需务必保证指针指向内存块的头位置。
如下所示,使用malloc在内存中开辟一块大小为3的char型数组,欲在使用后使用free函数将该数组释放。当执行下面这段代码时系统报错。
char* charPointer = NULL;
charPointer = (char*)malloc(3 * sizeof(char));
*charPointer = 'a';
*(charPointer + 1) = 'b';
*(charPointer + 2) = 'c';
for (int i = 1; i < 3; i++)
{
printf("%c", *charPointer);
charPointer = charPointer + 1;
}
free(charPointer);
charPointer = NULL;
报错原因在于当执行free(charPointer);语句时,charPointer指向了所申请数组的第三个元素位置而非数组的头位置,C无法将该块内存区进行释放。正确做法如下端程序所示,即将charPointer指针回退到需要被释放的内存块的头。
char* charPointer = NULL;
charPointer = (char*)malloc(3 * sizeof(char));
*charPointer = 'a';
*(charPointer + 1) = 'b';
*(charPointer + 2) = 'c';
for (int i = 1; i < 3; i++)
{
printf("%c", *charPointer);
charPointer = charPointer + 1;
}
charPointer = charPointer - 2; //调整指针位置
free(charPointer);
charPointer = NULL;