C语言之指针

来源:互联网 发布:网络直销是是骗局吗 编辑:程序博客网 时间:2024/04/29 19:05
 指针对C 语言的重要性不言而喻,不过,对其理解却非常容易有偏差。下面结合两个例子,希望能对指针有更进一步的认识。
void main(void)
{
        
char  *= (char *) malloc(10);
        strcpy(p,
"hello");
        printf(
"%s ",p);
        free(p);
        p 
= NULL;//可有可无
        p="peng";
        printf(
"%s ",p);
}
这个程序似乎是有问题的,因为指针p所指向的空间在中途已经被释放了。但是,再仔细分析下“peng"是const char *型,实际是存储在静态数据区里的,p只是指向这段空间。所以并不需要空间。就如char *p="peng"一样。所以此处的用法没有错。打印结果是hello peng。
    再来看关于二级指针的两个程序,注意其空间的分配以及回收。
//程序1
void main(void)
{
        
char  **= (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  **= (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;
}
仔细分析以上代码可以得出,二级指针内存的分配实际上有两种不同含义的空间,一个是二级指针指向的指针所在的空间,另一个则是最终指针指向的空间,第二种可有可无,根据具体情况,要注意释放内存的不同之处。
原创粉丝点击