malloc和new进行动态内存分配:
int *a;
a=new int;
与
int *a;
a=(int *)malloc(sizeof(int));
效果是一样的。
new返回的是指定类型的指针
malloc返回的只是一段内存的起始地址,通过最后需要我们强制转换为实际指定类型的指针
注意:
当内存不再使用时,应当用free(a)函数将内存块释放。
malloc分配不成功时返回空指针NULL。
(下面是摘录的一篇写的很好的文章,希望能帮到你)
为什么要进行动态分配内存
什么时候我们需要动态分配内存空间呢?举一个例子吧。
int *p;
我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的
我们之所以要为p这个变量分配空间是让它有一个明确的指向,打个比方吧!
你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。
虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。
这样我们就要通过动态分配内存的方式来认为的规定它的方向!
我们在刚刚接触指针的时候遇到过这样的情况,int *p;p=&a;这种方法不是指针的动态分配内存,这个叫做指针变量的初始化!初始化同样也可以让指针变量有方向可指。
int p;p=malloc(nsizeof(类型名称));我们通过malloc()函数为一个指针变量p分配了地址,这样我们从键盘上键入的值就这样存储在p里面了,接下来我们就可以对这个p进行具体的操作了,比如scanf(“%s”,p)等等。当我们对p结束操作的时候还要释放p的内存空间。为什么要释放内存空间呢?在上面我已经讲过动态分配的变量时储存在堆里面,但是这个堆的空间并不是无限大的,也许当我们编一个小的程序的时候可能我们并不能够发现什么,但是对于那些大的程序,如果我们没及时释放堆的空间的时候会放生内存泄露。所谓内存泄露是因为堆的空间被我们动态分配用完了,这样当我们再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。
同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针!何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!相对于malloc()函数,calloc()函数就不需要我们赋予NULL了,这是因为在每次调用完calloc()函数的时候系统会自动将原先的指针赋予一个空指针,即归于“0”。calloc()函数的原型是void calloc(count,sizeof(类型名称));比如:p=(char)calloc(4,sizeof(char));我们为p分配了指向char型指针的“4”个空间。