关于 free() 的参数有关问题

关于 free() 的参数问题
char *pstr = (char *)malloc(16);

char *abc = pstr;

abc += 3;

// 由于 abc指针 进行了移动,  free(abc) 还能把上面申请的 16个字节的内存释放吗? 还是释放 13 个字节?
free(abc); 



------解决思路----------------------
这就是不对. 不能这么用
------解决思路----------------------
内存管理器一般是这么记录每个内存块的,
(首地址,长度)
(首地址,长度)
(首地址,长度)
(首地址,长度)
(首地址,长度)
如果你没有给它传首地址,一般情况下它是认为你传的是个无效地址,不会有内存释放动作的。它在管理内存的时候,是按块管理的,不存在只删除一部分的情形。

参考 http://www.afanihao.cn/c_guide/  的第12章“动态内存分配” 
------解决思路----------------------
很显然,偏移3个后,释放的内存内存地址不是对齐的,会出错!
free配对malloc使用,即free的参数应该是malloc返回的地址值
------解决思路----------------------
// 由于 abc指针 进行了移动,  free(abc) 还能把上面申请的 16个字节的内存释放吗? 还是释放 13 个字节?

不是释放16个字节,也不是释放13个字节,因为free(abc)直接执行错误

为啥呢?
可以起看看malloc的源码
是因为malloc申请内存传递一个大小的参数得到一个指针,此时已经记录了指针和大小,当你释放的时候,就会去找这个指针,而你移动了指针,所以就找不到就直接报错了
------解决思路----------------------
引用:
Quote: 引用:

free
Deallocates or frees a memory block.

void free( void *memblock );

Function Required Header Compatibility 


赵老师,请问:

char *pstr = (char *)malloc(16);

char *abc = pstr;

free(abc);  //这样能正确的释放pstr指向的内存吗?