malloc 的作用是在内存的剩余空间,就是任何程序都没用的地方分配一块内存,把地址返回给程序。
所以 int *p; p = (int*)malloc(sizeof(int)); 的意思是说在内存的剩余空间分配一块大小为int的内存,把这块内存的地址赋值给 p,这样在给这块内存赋值:
*p = i; 实际上是把 i 保存到 malloc 分配的内存里了。
如果再次 p = (int*)malloc(sizeof(int)); 就是说在内存的剩余空间再分配一块大小为 int 的内存,把这个新分配的内存的地址赋值给 p,而先前用 malloc 分配的内存的地址等于多少就不知道了,先前的那块内存也就根本无法访问了,在内存里成为了“垃圾”。*p 的内容当然就是最后一次 malloc 的内存的内容了。
如果 malloc 的内存在不使用了的时候必须 free 掉,否则始终占用内存资源,而先前分配的内存没有被 free 掉就无法访问了,也就不能 free 了,成为一块内存漏洞。
malloc是在堆中分配内存空间的,只要使用时不超出该空间范围即可,要用free释放已分配空间。两次malloc是不会重叠的。
如果第一次 malloc 后有一些写内存的赋值操作,但是写入的字节数超过了分到的内存字节
数,再一次 malloc 时,重叠了一部分溢出地址,所以保存在溢出部份的值就变了。
所以 int *p; p = (int*)malloc(sizeof(int)); 的意思是说在内存的剩余空间分配一块大小为int的内存,把这块内存的地址赋值给 p,这样在给这块内存赋值:
*p = i; 实际上是把 i 保存到 malloc 分配的内存里了。
如果再次 p = (int*)malloc(sizeof(int)); 就是说在内存的剩余空间再分配一块大小为 int 的内存,把这个新分配的内存的地址赋值给 p,而先前用 malloc 分配的内存的地址等于多少就不知道了,先前的那块内存也就根本无法访问了,在内存里成为了“垃圾”。*p 的内容当然就是最后一次 malloc 的内存的内容了。
如果 malloc 的内存在不使用了的时候必须 free 掉,否则始终占用内存资源,而先前分配的内存没有被 free 掉就无法访问了,也就不能 free 了,成为一块内存漏洞。
malloc是在堆中分配内存空间的,只要使用时不超出该空间范围即可,要用free释放已分配空间。两次malloc是不会重叠的。
如果第一次 malloc 后有一些写内存的赋值操作,但是写入的字节数超过了分到的内存字节
数,再一次 malloc 时,重叠了一部分溢出地址,所以保存在溢出部份的值就变了。