|
#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 编辑 ] |
|