使用malloc创建头结点的坑

首先,malloc()是动态内存分配函数,用来向系统请求分配内存空间。当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。因为malloc只管分配内存空间,并不能对分配的空间进行初始化,所以申请到的内存中的值是随机的,经常会使用memset()进行置0操作后再使用。

与其配套的是free(),当申请到的空间不再使用时,要用free()函数将内存空间释放掉,这样可以提高资源利用率,最重要的是----就是因为它可以申请内存空间,然后根据需要进行释放,才被称为“动态内存分配”!

void *malloc(int size);

说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

从函数声明上可以看出。malloc  new 至少有两个不同:

new 可以自动返回指定类型的指针,并且可以自动计算所需要大小。

比如:

int *p;

p = new int;                   //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

或:

int* parr;

parr = new int [100];      //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;

 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。

int* p;

p = (int *) malloc (sizeof(int));

其次

1.malloc(0)会返回一个非空指针
2.malloc(0)返回的指针,对其使用free不会出错
3.malloc(-1)在vs和vc下运行出错,程序卡死在malloc那一行,linux则编译报错

最后

在创建链表的带头结点时,切记最好用 :

struct ListNode*cur= (struct ListNode*)malloc(sizeof(struct ListNode));

切记不要用struct ListNode*cur=malloc(0);      !!!!!


版权声明:本文为hgnuxc_1993原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。