指针的引用和全局指针局部分配
//最安全的情况是这样的
#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();
}
-------------------------------------------------------------------------------------------------------------
评论
发表评论