关于的 malloc,realloc 内存分配与释放的有关问题,请高手做答

关于的 malloc,realloc 内存分配与释放的问题,请高手做答!
假设用函数 malloc 分配了一段内存
int *p=(int*)malloc(100*sizeof(int));

问题1:
假设现在p 指向的地址是 A,
在使用的过程中,将 p的地址 指向了另一个 int的变量
int m=5;
p=&m;

那么之前用malloc 分配的那段内存还能释放掉吗?如何释放?

问题2:
假设我对p做了如下操作
p++;
也就是让 p 指向了这100个int变量的第二个变量,那么用
free(p) 释放 内存的时候,会完全释放掉 这100个int的内存吗?还是只释放了后面的99个?
其前面的第一个int变量是不是就成了永远无法收回的内存,直到程序结束?




------解决方案--------------------
1,不能,因为你不知道那块内存是刚才分配出来的。


2. 你的理解是对的。不仅会有你说的问题,虽然你知道你的p指向的是99个合法的内存,但是系统不知道。所以系统还是往下回收100个内存,就有
可能出错。



------解决方案--------------------

不是高手的回答:

问题1:
没有办法了。
要释放只能在你还没有丢掉内存地址之前。

问题2:
这种做法我也不知道会删掉多少,不过极有可能一个也没有删除掉。
------解决方案--------------------
这也是用malloc容易出错的地方所在~~

注意不要直接操作p,用一个temp指针指向p然后操作temp
至于你问的答案 l楼已经回答了
------解决方案--------------------
探讨
1,不能,因为你不知道那块内存是刚才分配出来的。


2. 你的理解是对的。不仅会有你说的问题,虽然你知道你的p指向的是99个合法的内存,但是系统不知道。所以系统还是往下回收100个内存,就有
可能出错。

------解决方案--------------------
这种动态分配来的地址指针,在释放前都是需要保存的。
------解决方案--------------------
假设用函数 malloc 分配了一段内存 
int *p=(int*)malloc(100*sizeof(int)); 

问题1: 
假设现在p 指向的地址是 A, 
在使用的过程中,将 p的地址 指向了另一个 int的变量 
int m=5; 
p=&m; 

那么之前用malloc 分配的那段内存还能释放掉吗?如何释放? 

其实是可以的,
这样:

int *p=(int*)malloc(100*sizeof(int)); 

int *q = p;

int m=5; 
p=&m; 
free(q);
就是了
你这样“刻意”把他的分配的内存的索引抹去了,如果你要搬起石头砸自己的脚,何必呢?

后面的问题
你的理解也是不对的,首先
你为什么要把p指向下一个再释放啊?
在你释放后的一瞬间你刻意回到前面的地方再释放的:
C/C++ code
int main() 
{ 
int *p=(int*)malloc(100*sizeof(int)); 
p++;
free(--p);
}

------解决方案--------------------
我忘记了一些,错了不要怪我,如果p指向的大小是sizeof(int),释放的就是第二个; 如果是整个100个int,那么是释放不了,那么简单,自己试试
------解决方案--------------------
问题1:无法释放内存,因为你无法知道所分配的内存的地址了
问题2:free函数有可能会抛出一个异常。malloc函数用于在堆上分配内存块,系统会维护一个所分配内存的链表,记录所有用malloc函数所分配的内存块首地址和长度等信息,free函数所给的首地址错误导致无法正确找到该内存块。