malloc即动态内存分配。
头文件
1
2
3
|
#include <stdlib.h>
或者
#include <malloc.h>
|
返回值
如果分配成功则返回指向被分配内存的
指针(此存储区中的初始值不确定),否则返回空指针
NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何
数据对象。
在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的
指针,并且可以自动计算所需要大小。比如:
1
2
3
int
*p;
p =
new
int
;
//返回类型为int *类型(整数型指针),分配大小为sizeof(int);
或:
1
2
3
int
*parr;
parr =
new
int
[100];
//返回类型为int *类型(整数型指针),分配大小为sizeof(int) * 100;
而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的
指针。
1
2
3
4
5
6
7
int
*p;
p = (
int
*)
malloc
(
sizeof
(
int
) * 128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double
*pd = (
double
*)
malloc
(
sizeof
(
double
) * 12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中
第一、malloc 函数返回的是 void * 类型。
对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。
所以必须通过 (int *) 来将
强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。
在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系统中是不允许malloc(0)的。
在规范的程序中我们有必要按照这样的格式去使用malloc及free:
1
2
3
4
5
6
7
8
9
10
type *p;
if
(NULL == (p = (type*)
malloc
(
sizeof
(type))))
/*请使用if来判断,这是有必要的*/
{
perror
(
"error..."
);
exit
(1);
}
...
/*其它代码*/
free
(p);
p = NULL;
/*请加上这句*/
malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
比如想分配100个int类型的空间:
1
2
int
*p = (
int
*)
malloc
(
sizeof
(
int
) * 100);
//分配可以放得下100个整数的内存空间。
另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到
指针,在其它操作上保持一致。
对其做一个特例补充
1
2
3
4
5
char
*ptr;
if
((ptr = (
char
*)
malloc
(0)) == NULL)
puts
(
"Gotanullpointer"
);
else
puts
(
"Gotavalidpointer"
);
此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的
指针。
返回值
1
2
3
|
int
*p;
p =
new
int
;
//返回类型为int *类型(整数型指针),分配大小为sizeof(int);
|
1
2
3
|
int
*parr;
parr =
new
int
[100];
//返回类型为int *类型(整数型指针),分配大小为sizeof(int) * 100;
|
1
2
3
4
5
6
7
|
int
*p;
p = (
int
*)
malloc
(
sizeof
(
int
) * 128);
//分配128个(可根据实际需要替换该数值)整型存储单元,
//并将这128个连续的整型存储单元的首地址存储到指针变量p中
double
*pd = (
double
*)
malloc
(
sizeof
(
double
) * 12);
//分配12个double型存储单元,
//并将首地址存储到指针变量pd中
|
1
2
3
4
5
6
7
8
9
10
|
type *p;
if
(NULL == (p = (type*)
malloc
(
sizeof
(type))))
/*请使用if来判断,这是有必要的*/
{
perror
(
"error..."
);
exit
(1);
}
...
/*其它代码*/
free
(p);
p = NULL;
/*请加上这句*/
|
1
2
|
int
*p = (
int
*)
malloc
(
sizeof
(
int
) * 100);
//分配可以放得下100个整数的内存空间。
|
1
2
3
4
5
|
char
*ptr;
if
((ptr = (
char
*)
malloc
(0)) == NULL)
puts
(
"Gotanullpointer"
);
else
puts
(
"Gotavalidpointer"
);
|