关于c语言动态内存分配的问题
1个回答
展开全部
内存分配一般使用stdlib.h中的二个函数:malloc和free
malloc的原型是:void* malloc(size_t size);
含义是从内存堆中分配连续的size个字节,并返回这块空间的首地址,也叫基址。
为什么返回的是void*地址类型呢?因为c运行库不知道程序猿分配的空间中存放什么类型的数值,所以只能返回void*了。
虽然运行库不知道分配的空间中存放什么类型,但程序员当然知道,所以在程序中要做强制类型转换滴。
C语言有个可移植性的关键字,叫sizeof,它检测的是一个类型的数值所占据空间的大小,大小的度量单位是字节,一个int占据空间的大小=sizeof(int),一个双精度实数占据空间的大小=sizeof(double)。
如果要动态分配10个int数值的内存空间,则该内存空间的大小=10*sizeof(int)。相信你懂的哈。这块空间的起始地址类型是int *,你也懂的哈,为什么?因为空间里放的是整型数啊,不是int*还能是什么,对不?好了,下面的程序片段就出来了:
int* p;
p=(int*)malloc(10*sizeof(int));
看到没有,这里做了一次强制类型转换,从void*==》int*,道理前面说清楚了哈。
要是空间小,装不下10个整型数怎么办?malloc很霸道的返回0地址,也就是NULL符号常量。放心,空间够,malloc肯定给你分配成功的,也就是返回你一个非0的地址。所以在上面的语句后,程序猿又紧跟一句:
if(!p) exit(0);
就是程序退出的意思,当然根据需要,也可以做其它处理的哈。
看到这儿,相信你用malloc动态分配内存得心应手了。
当分配的空间使用完毕,后面不再需要时,记得有句话叫“好借好还”,要把这块空还给堆,不然就内存泄露啦,也就是内存空间越用越少,最后的结果你明白的。
要还很简单,用free。下面的是它的原型:
void free(void*);
意思是把malloc分配的基址作为参数传给它,它负责释放。
把上面分配的空间释放语句如下:
free(p);
注意如果你传给它的不是malloc分配空间的基址,那么,呵呵,后果自负。比如:
p=(double*)malloc(20*sizeof(double));
....
p++;
....
free(p);
如果你敢像上面这么写,free就敢罢工,凭什么借的多,还的少?给你点颜色瞧瞧,希望你不会哈。
就写这么多,希望帮到你哈。写这么多也必须自我佩服一下,看来我真是个好人哎,哈哈哈哈。
<b>(完)</b>
malloc的原型是:void* malloc(size_t size);
含义是从内存堆中分配连续的size个字节,并返回这块空间的首地址,也叫基址。
为什么返回的是void*地址类型呢?因为c运行库不知道程序猿分配的空间中存放什么类型的数值,所以只能返回void*了。
虽然运行库不知道分配的空间中存放什么类型,但程序员当然知道,所以在程序中要做强制类型转换滴。
C语言有个可移植性的关键字,叫sizeof,它检测的是一个类型的数值所占据空间的大小,大小的度量单位是字节,一个int占据空间的大小=sizeof(int),一个双精度实数占据空间的大小=sizeof(double)。
如果要动态分配10个int数值的内存空间,则该内存空间的大小=10*sizeof(int)。相信你懂的哈。这块空间的起始地址类型是int *,你也懂的哈,为什么?因为空间里放的是整型数啊,不是int*还能是什么,对不?好了,下面的程序片段就出来了:
int* p;
p=(int*)malloc(10*sizeof(int));
看到没有,这里做了一次强制类型转换,从void*==》int*,道理前面说清楚了哈。
要是空间小,装不下10个整型数怎么办?malloc很霸道的返回0地址,也就是NULL符号常量。放心,空间够,malloc肯定给你分配成功的,也就是返回你一个非0的地址。所以在上面的语句后,程序猿又紧跟一句:
if(!p) exit(0);
就是程序退出的意思,当然根据需要,也可以做其它处理的哈。
看到这儿,相信你用malloc动态分配内存得心应手了。
当分配的空间使用完毕,后面不再需要时,记得有句话叫“好借好还”,要把这块空还给堆,不然就内存泄露啦,也就是内存空间越用越少,最后的结果你明白的。
要还很简单,用free。下面的是它的原型:
void free(void*);
意思是把malloc分配的基址作为参数传给它,它负责释放。
把上面分配的空间释放语句如下:
free(p);
注意如果你传给它的不是malloc分配空间的基址,那么,呵呵,后果自负。比如:
p=(double*)malloc(20*sizeof(double));
....
p++;
....
free(p);
如果你敢像上面这么写,free就敢罢工,凭什么借的多,还的少?给你点颜色瞧瞧,希望你不会哈。
就写这么多,希望帮到你哈。写这么多也必须自我佩服一下,看来我真是个好人哎,哈哈哈哈。
<b>(完)</b>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询