
int main()
{
int p;
p=(int ) malloc(1024);
p=3;
printf("p address is%p\n",p);
printf("p is%d\n",p);
free(p); //这个函数是释放内存malloc函数的内存单元;一定要有。
printf("%p\n",p);
return 0;
}
malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
看来你一定是个初学者。当你需要成千上万的数据时你能像int a=5;int p; p=&a;一样定义那么多数吗?int p; p=(int )malloc(100sizeof(int));实际上可以理解为声明了一个p[100]的int型数组,你怎么用数组就怎么用p的个指针。那么为什么不直接int a[100]这样声明呢?当然可以,这得从两方面说明:1当你知道用多少个数据时,用int a[100]要比用malloc那样方便得多,但很多时候是不知道需要多少数据,要根据需要临时输入数据个数再声明数组——这就有问题了:C是不允许用变量做数组的声明大小的;若尽量往大里安排,那么你事先安排了2000个数据空间,而大部分时候却只使用10个,那不是对很有限的存存空间的无谓浪费吗?2int a[100]这样声明的空间在栈上;栈相对较小,声明太大的数组是放不下的,比如sz[2000][2000]在很多编译器下是不成功的。而用malloc声明的空间在堆上,那里很大很大,可以安排很大的数据量。使用malloc创建的指针p是可以指向别处的,不像你说的不能再p="123"了。但你不能这样做,因为在堆上分配空间是永久性的,必须人工释放,你让它的指针指向别处了,那分配的空间就找不到了(因为空间头指针是唯一记号),可是它还在那里放着释放不了;累积多了就把内在消耗光了——这叫内在泄漏!所以,用了p=(int )malloc(100sizeof(int));,完了必须得用free(p);来释放分配的内存空间。
这个问题首先得从堆栈说起,一个程序一般分为三段:代码段,数据段(静态数据),和堆栈段。堆栈段存储程序中的变量、程序传递的参数等(动态分配的变量存储在堆中,静态分配的存储在栈中)。堆栈的增长方式如下:
程序在运行的时候会预先分配堆栈空间,所以你的问题中不一定修改了不该修改的地方,有可能那里本来就是空的。
再回到malloc这个函数上来,malloc主要负责分配空间,返回该空间的首地址。那为什么申请空间为0,却可以存储7个字符呢?那是因为C语言的指针中并不检查数组的越界问题,不信的话,你可以这样:char ch[5],然后你去读写ch[6](printf或scanf),这样是不会报错的。但是我们在使用的时候,千万别越界使用,因为这样的程序是非常危险的,试想,如果越界使用的地址正好是一个 *** 作系统的地址,那么你一修改,系统就崩了。同时,C语言的这个机制被黑客广泛地应用与缓冲区溢出攻击,所以你非但不能越界使用指针,还得时刻考虑到指针(数组)是否越界,以加强程序的安全性。
希望对你有所帮助。。。
sizeof(struct person)代表一个persion结构所占用内存的大小
此处sizeof(struct person) = 20 + 4 = 24
同时,malloc返回的是所分配内存块的指针,即地址,用于访问这个struct
我一般用C++就说new吧,malloc就格式有些差别
new type[length](initialization); //length是数组长度,如果动态分配数组填入,不是省略即可p=new int[7](); //int p;
size_t SIZE=sizeof (p); //获取内存大小,sizeof char;恒为1
以上就是关于如何使用malloc函数分配的内存函数用途是什么全部的内容,包括:如何使用malloc函数分配的内存函数用途是什么、malloc函数分配的内存如何使用与函数用途、C语言 malloc()函数 分配内存空间尺寸的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)