函数
malloc()
和
calloc()
都可以用来动态分配内存空间
,
但两者稍有区别。
malloc()
函数有一个参数
,
即要分配的内存空间的大小
:
void*malloc(size_tsize);
calloc()
函数有两个参数
,
分别为元素的数目和每个元素的大小
,
这两个参数的乘积就是要分配的内存空间的大小。
void*calloc(size_tnumElements,size_tsizeOfElement);
如果调用成功
,
函数
malloc()
和函数
calloc()
都将返回所分配的内存空间的首地址。
函数
malloc()
和函数
calloc()
的主要区别是前者不能初始化所分配的内存空间
,
而后者能。如果由
malloc()
函数分配的内存空间原来没有被使用过,则其中的每一位可能都是
0;
反之
,
如果这部分内存曾经被分配过
,
则其中可能遗留有各种各样的数据。也就是说,使用
malloc()
函数的程序开始时
(
内存空间还没有被重新分配
)
能正常进
行
,
但经过一段时间
(
内存空间还已经被重新分配
)
可能会出现问题。
函数
calloc()
会将所分配的内存空间中的每一位都初始化为零
,
也就是说
,
如果你是为字符类型或整数类型的元素分配内存
,
那麽这些元素将保证会被初始化为
0;
如果你是为指
针类型的元素分配内存
,
那麽这些元素通常会被初始化为空指针
;
如果你为实型数据分配内存
,
则这些元素会被初始化为浮点型的零。
malloc
用于申请一段新的地址
,
参数
size
为需要内存空间的长度
,
如
:
char* p;
p=(char*)malloc(20);
calloc
与
malloc
相似
,
参数
nelem
为申请地址的单位元素长度
,elsize
为元素个数
,
如
:
char* p;
p=(char*)calloc(sizeof(char),20);
这个例子与上一个效果相同
realloc
是给一个已经分配了地址的指针重新分配空间
,
参数
ptr
为原有的空间地址
,newsize
是重新申请的地址长度
如
:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);
注意,这里的空间长度都是以字节为单位。
C
语言的标准内存分配函数:
malloc
,
calloc
,
realloc
,
free
等。
malloc
与
calloc
的区别为
1
块与
n
块的区别:
malloc
调用形式为
(
类型
*)malloc(size)
:在内存的动态存储区中分配一块长度为
“size”
字节的连续区域,返回该区域的首地址。
calloc
调用形式为
(
类型
*)calloc(n
,
size)
:在内存的动态存储区中分配
n
块长度为
“size”
字节的连续区域,返回首地址。
realloc
调用形式为
(
类型
*)realloc(*ptr
,
size)
:将
ptr
内存大小增大到
size
。
free
的调用形式为
free(void*ptr)
:释放
ptr
所指向的一块内存空间。
C++
中为
new/delete
函数。
malloc
的功能是确保内存空间使用字节。比如限定
100
,函数使用方法:
(char *)malloc(100)
超过
100
就会出错。
程序例:
#include <stdlib.h>
#include <stdio.h>
//#include <malloc.h>
void main( void )
{
char *str;
str = (char *)malloc(100);
if( str == NULL )
printf( "
不能确保内存领域。
/n" );
else
printf( "
可以确保
100
字节内存。
/n" );
free( str );
printf( "
解放内存。
/n" );
getchar();
}
------------------------------------------------------------------
calloc
则限定了每个要素的内存使用字节量
例:
(char *)calloc(4,100);
程序例:
#include <stdlib.h>
#include <stdio.h>
//#include <malloc.h>
void main( void )
{
char *str;
str = (char *)calloc(4,100);
if( str == NULL )
printf( "
不能确保内存领域。
/n" );
else
printf( "
可以确保
4x100
字节内存。
/n" );
free( str );
printf( "
解放内存。
/n" );
getchar();
}
首先看个问题程序
(
这里用的是
TC
编译器
)
:
#include "stdlib.h"
#include "stdio.h"
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
*(i+1)=2;
printf("%x|%d/n",i,*i);
printf("%x|%d",i+1,*(i+1));
}
输出的结果是:
8fc|1
8fe|2
这个程序编译通过,运行正常,说它有问题,问题出在哪呢?
首先通过
malloc
,建了一个大小为
2
的堆,
i
指向的地址是
8fc
,
i
+
1
指向的地址是
8fc+sizeof(int)=8fe
但是地址
8fe
是不受保护的,因为它不是机器分配给
i
+
1
的,随时会被其他变量占用。
正确的做法是
#include "stdlib.h"
#include "stdio.h"
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
i=(int *)realloc(i,2*sizeof(int));
*(i+1)=2;
printf("%x|%d/n",i,*i);
printf("%x|%d",i+1,*(i+1));
}
realloc
可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。
realloc
并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,
realloc
返回的指针很可能指向一个新的地址。
所以,在代码中,我们必须将
realloc
返回的值,重新赋值给
p :
p = (int *) realloc (p, sizeof(int) *15);
甚至,你可以传一个空指针(
0
)给
realloc
,则此时
realloc
作用完全相当于
malloc
。
int* p = (int *) realloc (0,sizeof(int) * 10); //
分配一个全新的内存空间,
这一行,作用完全等同于:
int* p = (int *) malloc(sizeof(int) * 10);
『附注:
TC
编译器里
sizeof(int)=2
,
VC
里面
sizeof(int)=4
;
char
型在两个编译器里是一样的,都是
1
个字节(
8
位)』
calloc
与
malloc
相似
,
参数
nelem
为申请地址的单位元素长度
,elsize
为元素个数
,
如
:
char* p;
p=(char*)calloc(sizeof(char),20);
这个例子与上一个效果相同
原文来自:http://blog.csdn.net/jlccl/archive/2007/05/23/1622834.aspx
原文来自:http://blog.csdn.net/jlccl/archive/2007/05/23/1622834.aspx