指针对C 语言的重要性不言而喻,不过,对其理解却非常容易有偏差。下面结合两个例子,希望能对指针有更进一步的认识。
这个程序似乎是有问题的,因为指针p所指向的空间在中途已经被释放了。但是,再仔细分析下“peng"是const char *型,实际是存储在静态数据区里的,p只是指向这段空间。所以并不需要空间。就如char *p="peng"一样。所以此处的用法没有错。打印结果是hello peng。
再来看关于二级指针的两个程序,注意其空间的分配以及回收。
仔细分析以上代码可以得出,二级指针内存的分配实际上有两种不同含义的空间,一个是二级指针指向的指针所在的空间,另一个则是最终指针指向的空间,第二种可有可无,根据具体情况,要注意释放内存的不同之处。
void
main(
void
)
{
char *p = (char *) malloc(10);
strcpy(p,"hello");
printf("%s ",p);
free(p);
p = NULL;//可有可无
p="peng";
printf("%s ",p);
}
{
char *p = (char *) malloc(10);
strcpy(p,"hello");
printf("%s ",p);
free(p);
p = NULL;//可有可无
p="peng";
printf("%s ",p);
}
再来看关于二级指针的两个程序,注意其空间的分配以及回收。
//
程序1
void main( void )
{
char **p = (char **) malloc(2*sizeof(char *));//分配两个指针的空间
p[0]="12345";//指针指向静态存储区
p[1]="67890";
printf("%s,%s ",p[0],p[1]);
free(p);//只需释放指针的空间
p = NULL;
}
void main( void )
{
char **p = (char **) malloc(2*sizeof(char *));//分配两个指针的空间
p[0]="12345";//指针指向静态存储区
p[1]="67890";
printf("%s,%s ",p[0],p[1]);
free(p);//只需释放指针的空间
p = NULL;
}
//
程序2
void main()
{
char **p = (char **) malloc(2*sizeof(char *));//给二级指针分配两个指针的空间
*p=(char *)malloc(10*sizeof(char));//为二级指针指向的指针分配其指向的空间
*(p+1)=(char *)malloc(10*sizeof(char));
strcpy(p[0],"12345");
strcpy(p[1],"67890");
printf("%s,%s ",p[0],p[1]);
for(int i=0; i<2;i++)
{
if(p[i] != NULL)
{
free(p[i]);//释放分配二级指针指向的指针所指的空间,否则会有内存泄漏
p[i] = NULL;
}
}
free(p);//释放二级指针的空间
p=NULL;
}
void main()
{
char **p = (char **) malloc(2*sizeof(char *));//给二级指针分配两个指针的空间
*p=(char *)malloc(10*sizeof(char));//为二级指针指向的指针分配其指向的空间
*(p+1)=(char *)malloc(10*sizeof(char));
strcpy(p[0],"12345");
strcpy(p[1],"67890");
printf("%s,%s ",p[0],p[1]);
for(int i=0; i<2;i++)
{
if(p[i] != NULL)
{
free(p[i]);//释放分配二级指针指向的指针所指的空间,否则会有内存泄漏
p[i] = NULL;
}
}
free(p);//释放二级指针的空间
p=NULL;
}