看来你一定是个初学者。当你需要成千上万的数据时你能像int a=5;int *p; p=&a;一样定义那么多数吗?int *p; p=(int *)malloc(100*sizeof(int));实际上可以理解为声明了一个p[100]的int型数组,你怎么用数组就怎么用p的个指针。那么为什么不直接int a[100]这样声明呢?当然可以,这得从两方面说明:1.当你知道用多少个数据时,用int a[100]要比用malloc那样方便得多,但很多时候是不知道需要多少数据,要根据需要临时输入数据个数再声明数组——这就有问题了:C是不允许用变量做数组的声明大小的;若尽量往大里安排,那么你事先安排了2000个数据空间,而大部分时候却只使用10个,那不是对很有限的存存空间的无谓浪费吗?2.int a[100]这样声明的空间在栈上;栈相对较小,声明太大的数组是放不下的,比如sz[2000][2000]在很多编译器下是不成功的。而用malloc声明的空间在堆上,那里很大很大,可以安排很大的数据量。使用malloc创建的指针p是可以指向别处的,不像你说的不能再p="123"了。但你不能这样做,因为在堆上分配空间是永久性的,必须人工释放,你让它的指针指向别处了,那分配的空间就找不到了(因为空间头指针是唯一记号),可是它还在那里放着释放不了;累积多了就把内在消耗光了——这叫内在泄漏!所以,用了p=(int *)malloc(100*sizeof(int));,完了必须得用free(p);来释放分配的内存空间。
首先考虑你最后一个问题:用malloc函数得到的指针之后能用来干什么了?
我们平常程序与现实环境的交互中,很多输入的数据是不能预测的,不管是数据内容还是数据量都可能超出我们本身的预期,我们这个malloc函数就是为了应对不确定的数据量而生的。比如一个检测字符输入的程序(如百度的输入框),平常我们要往输入框里头输的东西不是很多,你设置个128的数组或许都已经满足需要了,但是如果把环境换一下,某一天有人往里头输入了1K的数据,或者1M的数据怎么办?不管我们的数组设置成多大,都有可能会有满的时候。而这个时候如果我用链表组织多个即时申请的内存块(函数malloc的功能),那么无论你装多少东西都能满足。不单只在输入方面,比如你QQ传输文件,你传过来的文件的大小是随机的,而程序如果固定用一个数组来装你的文件就可能溢出,而如果我有malloc,那么只要在运行时根据你传过来的文件size即时申请一个内存块就OK了。
前面那个问题:有什么办法能去给p所指向的那块地址赋值?
已知:p=(int *)malloc(100*sizeof(int));你只要用*(p+i)就可以访问块里的第i个整型数据了!例如:
p=(int *)malloc(100*sizeof(int));
*(p+0)=1;
*(p+1)=2;
*(p+4)=*(p+1)+*(p+0) ;
最主要有三点:
第一,用malloc可以声明很大的内存空间,当你要处理大数据的时候可能就会用到。因为你在函数中申请内存,会受到栈大小的限制,VC程序的栈默认是1M,如果你在函数中申请的内存大于1M,那就会引起栈溢出,导致你的程序死掉。
第二,malloc声明的内存空间,生命期直到你调用free释放或程序退出,而函数中的变量,在函数返回时就被释放了。
第三,malloc返回的指针,是指向你申请的内存空间地址的,你在函数中定义一个指针p,是用来临时保存这个内存空间地址的,以便你的函数中后序代码使用你用malloc申请的空间。
举个简单的例子,你电脑上有一张高清图片,假如有3M,那么你的程序中要修改这张图片,你可能需要把图片完全载入内存,然后再进行操作,这个时候你就可以用malloc申请一个3M的空间,然后再把你的图片读出来存到这片内存中,然后你再写其他代码来修改图片,就是这样。
按你说的,直接int a=5;int *p; p=&a;这样确实是把a的指针赋给了p,但是看你怎么用。因为a是int型,有4个字节,如果你只要修改a的第1个字节,你就可以这样用p:
int a = 285;
uchar *p = (uchar*)&a;
*p = 3;
这样的话a就等于259了。
可以用for(i=0;i<=n;i++)p+i=and......
函数分配的内存如何使用与函数用途
1 分钟前 提问者悬赏:30分 | 吴涵宇_ | 分类:C/C++ | 浏览4次
在网上看到的都是malloc函数的使用方法,但是却不知道malloc函数的用途,int *p; p=(int *)malloc(100*sizeof(int));那么只要p不是NULL就代表内存分配成功了,既然p已经指向了系统分配给我的一块内存地址,那就不能再 p="123";这样了,那么之后呢 我拿着这指针p能干什么呢?这是很让我困扰的问题,难道有什么办法能去给p所