QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1907|回复: 0

有关malloc

[复制链接]
发表于 2009-2-1 00:37:59 | 显示全部楼层 |阅读模式
#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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-16 11:34 , Processed in 0.106106 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表