指针的引用和全局指针局部分配

//最安全的情况是这样的


#include <iostream.h>
#include <malloc.h>


int *b=NULL;
void Create( )
{
b=(int *)malloc(5*sizeof(int));
for(int i=0;i<5;i++)
{b[i]=i;}


}
void Use()
{

Create();
for(int i=0;i<5;i++)
{
   cout<<b[i]<<endl;
}
}


void main()
{
Use();
}


------------------------------------------


情况二
#include <iostream.h>
#include <malloc.h>


int *b=NULL;
void Create( )
{
int * a=(int *)malloc(5*sizeof(int));
for(int i=0;i<5;i++)
{a[i]=i;}
b=a;//注意这样


}
void Use()
{

Create();
for(int i=0;i<5;i++)
{
   cout<<b[i]<<endl;
}


free(b);//注意把占用的东西给退回去
}


void main()
{
Use();
}


情况二点评:
这种情况下,要记着free(b),由于用了两个指针(b和a)来指向在堆中分配的内存,所以容易造成野指针。


---------------------------------------------------------------------


情况三:


#include <iostream.h>
#include <malloc.h>


int *b=NULL;
void Create(int *a )
{
int * a=(int *)malloc(5*sizeof(int));  /*在这种情况下,由于int *a=b,形参为*a,而且为传值调用,一旦a指向了 在堆中分配的内存,那么a<>b,所以,这个时候b仍然是NULL,因此在函数体外面试图去根据b访问这个在堆中分配的数组,那么就出现了错误*/
for(int i=0;i<5;i++)
{a[i]=i;}


}
void Use()
{

Create();
for(int i=0;i<5;i++)
{
   cout<<b[i]<<endl;
}
}


void main()
{
Use();
}


-------------------------------------------------------------------------------------------------------------

评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

提交了30次才AC ---【附】POJ 2488解题报告