| 
 | 
 
#define MAX 100 
char *lineptr[MAX]; //行指针 
int last; //行数 
int modified;//修改标志 
 
void replace() 
{ 
        int k,m,n,i,j; 
        sscanf(chpt,"%d%d%d",&k,&m,&n);        /* 读入参数 */ 
        if(m<=0||m>last||n<m||last-(n-m+1)+k>=MAXLINE)/* 检查参数合理性 */ 
        { 
                printf("Error!\n"); 
                return; 
        } 
        /* 先完成删除 */ 
        if(n>last) 
                n=last;                /* 修正参数 */ 
        for(i=m;i<=n;i++)        /* 删除正文 */ 
                free(lineptr[i-1]); 
        for(i=m,j=n+1;j<=last;i++,j++) 
                lineptr[i-1]=lineptr[j-1]; 
        last=i-1; 
        /* 以下完成插入 */ 
        for(i=last;i>=m;i--) 
                lineptr[i+k-1]=lineptr[i-1]; 
        for(i=0;i<k;i++) 
        { 
                fgets(buffer,MAXLEN,stdin); 
                lineptr[m+i-1]=(char *)malloc(strlen(buffer)+1); 
                strcpy(lineptr[m+i-1],buffer); 
        } 
        last+=k;        /* 修正正文行数 */ 
        modified=1;        /* 正文被修改 */ 
} 
 
这是一个c语言示例的函数,功能是用k行新的文本替换原来m到n行的内容,但是我感觉这个函数对指针的使用很混乱:        for(i=m;i<=n;i++)        /* 删除正文 */ 
                free(lineptr[i-1]); 
        for(i=m,j=n+1;j<=last;i++,j++) 
                lineptr[i-1]=lineptr[j-1]; 
 
        for(i=last;i>=m;i--) 
                lineptr[i+k-1]=lineptr[i-1]; 
        for(i=0;i<k;i++) 
        { 
                fgets(buffer,MAXLEN,stdin); 
                lineptr[m+i-1]=(char *)malloc(strlen(buffer)+1); 
                strcpy(lineptr[m+i-1],buffer); 
        } 
首先:释放m到n范围的内存 
然后m到n指向后面相应的空间 
然后从m行开始的k行向后移动 
然后从m行开始的k行被重新分配内存 
这让人感觉很混乱: 
好多未被释放的内存被赋新值,很多运行状态多个指针指向同一块内存,我做了实验,指针可以在被释放前调用malloc获取新的内存地址,而用一个新的指针对另一个指针分配的内存进行操作,这些都让本来就是非颇多的指针更加混乱,我认为以上代码的风格很成问题,以上是本人的理解,不知道是不是正确,请指正(本人现在的功力还看不懂malloc的源代码,所以只能提出这样的问题,请老鸟们谅解) 
但问题在于:这代码给人的另一种感觉是作者对指针的使用已是炉火纯青,达到随心所欲的境界,非我这等菜鸟可以体会,不知道我的理解是不是有正确的成分,请老鸟指正。 
 
[ 本帖最后由 dusx1981 于 2009-2-1 01:05 编辑 ] |   
 
 
 
 |