C语言中malloc和free的问题

问题描述

C语言中malloc和free的问题
int *intPointer = (int *)malloc(3 * sizeof(int));

intPointer[0] = 1;
intPointer[1] = 2;
intPointer[2] = 3;

printf("before free :%ld
",intPointer);

free(intPointer);

printf("after  free :%ld
",intPointer);
printf("%d	%d	%d
",intPointer[0],intPointer[1],intPointer[2]);

输出结果:
before free :4296037472
after free :4296037472
1 2 3

疑问:free(intPointer)之后,为什么还能通过intPointer访问malloc分配的那片内存?

解决方案

举个例子来说,如果有个人经常问你借一样东西:
对这个东西的处理方法有两种:
(1)他不停地借、还,耗时,效率低。
(2)让他借一次,等他的确不用的时候再还,但是在他没还之前,别人就不能用了。
malloc就是借内存,free就像是还内存
操作系统为了提高效率,就采用了第(2)处理办法,反正操作系统可以搞到很多内存。
free可以理解为“假还”,东西还在你那里,但是你不应该继续使用了,应该去借。
对于部分操作系统,free之后是把intPointer[0].....的值给删除了、部分不是。
另外提一句:
free之后要,intPointer = NULL;
理解万岁!!!

解决方案二:

写程序时用malloc竟然出现段错误,而且明显那块没有用错,肯定是别的地方有内存泄漏的问题,导致最后内存泄漏了。需要好好查一查原因了。但程序中很多地方都用来malloc,内存全是随便用的,要改起来估计十分麻烦。。。。
????
??下面找了点malloc与free的介绍,先看......
答案就在这里:C语言中malloc与free
----------------------

解决方案三:

free当然可以在此分配了,如果不分配,访问会出错

解决方案四:

free后,指针不可用,但是再次分配了,如果不分配,访问会出错

解决方案五:

free函数只是释放了你对那片空间的使用权。调用free函数之后其它程序就可以访问这段内存空间了。

解决方案六:

before free :5592120
after free :5592120
-17891602 -17891602 -17891602
这是我用你的代码的输出结果,所以应该不存在你说的那个问题

#include
#include

int main(void)
{
int *intPointer = (int *)malloc(3 * sizeof(int));

intPointer[0] = 1;
intPointer[1] = 2;
intPointer[2] = 3;

printf("before free :%ld
", intPointer);

free(intPointer);

printf("after  free :%ld
", intPointer);
printf("%d	%d	%d
", intPointer[0], intPointer[1], intPointer[2]);

system("pause");

}


解决方案七:

free只是通知内存分配器释放这部分内存空间,但是还是有可能恰巧还能让你访问到,但这种行为是未知的,可能引起各种错误

解决方案八:

free(intPointer)只是告诉操作系统这段内存可以被申请了,这段内存内容并未因此消失,黑客可以利用这个进行内存攻击,安全要求较高的代码需要重新对这段内存清空,一般就是写零值

解决方案九:

free(intPointer)只是告诉操作系统这段内存可以被申请了,这段内存内容并未因此消失,黑客可以利用这个进行内存攻击,安全要求较高的代码需要重新对这段内存清空,一般就是写零值

解决方案十:

忘了说,指针就是一个内存索引值,通过这个值可以访问指定位置的内存内容,所以你会获取到相同的内容,如果把指针值重置,则结果是未知的

时间: 2024-11-10 01:06:47

C语言中malloc和free的问题的相关文章

关于c语言中malloc函数的问题

问题描述 关于c语言中malloc函数的问题 c语言中,在子函数中用malloc函数开辟的空间在主函数中还有效吗? 解决方案 原型:? void *malloc(unsigned int size); #include或#include malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存. malloc 向系统申请分配指定size个字节的内存空间(连续的一块内存).返回类型是 void* 类.

c语言中malloc、realloc与calloc 的区别以及联系_C 语言

ANSI C说明了三个用于存储空间动态分配的函数(1) malloc分配指定字节数的存储区.此存储区中的初始值不确定 (2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间.该空间中的每一位(bit)都初始化为0 (3) realloc  更改以前分配区的长度(增加或减少).当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定 .分配函数时再分配 realloc()使我们可以增.减以前分配区的长度(最常见的用法是增加该区). 如果先分配一个可容

C语言中的malloc使用详解_C 语言

一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的.) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL. 当内存不再使用时,应使用free()函数将内存块释放. 举例: #include<stdio.h&g

c语言中static用法总结

一.c程序存储空间布局   C程序一直由下列部分组成: 正文段--CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 初始化数据段(数据段)--在程序中所有赋了初值的全局变量,存放在这里. 非初始化数据段(bss段)--在程序中没有初始化的全局变量:内核将此段初始化为0. 栈--增长方向:自顶向下增长:自动变量以及每次函数调用时所需要保存的信息(返回地址:环境信息). 堆--动态存储分. |-----------||           ||-------

C语言中void*详解及应用

 void在英文中作为名词的解释为"空虚:空间:空隙":而在C语言中,void被翻译为"无类型",相应的void *为"无类型指针".void似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释. 本文地址:http://www.cnblogs.com/archimedes/p/c-void-point.html,转载请注明源地址. void的作用: 1

c语言-C语言中Free函数释放内存为何释放不了!!!!!!!

问题描述 C语言中Free函数释放内存为何释放不了!!!!!!! #include #include void testFree(char *par) { void*free(par); par = NULL; } int _tmain(int argc, _TCHAR* argv[]) { char path[10] = {"abc"}; char *str = (char *) malloc(100 *sizeof(char)); memset(str,0x00,100 *size

字符串截取-求助c语言中strtok的用法,关于指针的问题

问题描述 求助c语言中strtok的用法,关于指针的问题 写了一个分割字符串的方法,放在循环体调用出了点问题.请达人指点inline code void readraw(char *sentence){ raw_t *raw = malloc(sizeof(raw) *20); char *q = malloc(1024); const char *delim = "n"; char *p = strtok(sentence, delim); while (p) { printf(&q

C语言中char*和char[]用法区别分析_C 语言

本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以: 当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written". 当用char s[]=&q

C语言中char* 和 char []区别

原文:C语言中char* 和 char []区别 想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written&q