| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:谢了一个方法,感觉很奇怪,大家看看问题出在哪里了。
只看楼主 加入收藏
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
结帖率:96.55%
收藏
已结贴  问题点数:20 回复次数:2 
谢了一个方法,感觉很奇怪,大家看看问题出在哪里了。
这个是有问题的方法,该方法用了gcc的一个扩展库方法asprintf(),需要注意一下。
程序代码:
void DebugIntArrayVar(char * label,char * varName,int * value,int rows,int cols)
{
    char * debugFilePath=DEBUG_FILE_PATH;
    char * newContent;
    char * oldContent;

    asprintf(&newContent,"Label %s :\n",label);
    oldContent=newContent;

    asprintf(&newContent,"%s%s :\n",oldContent,varName);
    free(oldContent);
    oldContent=newContent;

    int i,j;
    for(i=0;i<rows;i++)
    {
        for(j=0;j<cols;j++)
        {
            asprintf(&newContent,"%s\t%d",oldContent,value[i*cols+j]);
            free(oldContent);        // 经调试此处报错。
            oldContent=newContent;
        }
        asprintf(&newContent,"%s\n",oldContent);
        free(oldContent);
        oldContent=newContent;
    }

    AttachToFile(debugFilePath,oldContent);    // 该方法用于将字符串写进文件中,可以注释掉。
    free(oldContent);

    return;
}


在下面这个main()方法中调用没有问题
程序代码:
int main(void)
{
    int intArrayVar2[][10]={{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};
    DebugIntArrayVar("27","intArray2",&intArrayVar2[0][0],2,3);

    return 0;
}


但在下面这个main()方法中调用就有问题了。
这个方法也没做什么事情,没有实现完成,就是做了个计算“9876”*“9876”这样的运算。大概思路是用我们常用的竖式乘法的方法计算。没什么含金量,就是为了测试那个让人郁闷的方法正确不。
程序代码:
#define MAXBIT 1024

int main(void)
{
    char r[MAXBIT];
    int n;
    int r_len;
    int temp;
    char * base;
    int i,j,k;
    int * result_temp;
    int * result;

    strcpy(r,"9876");
    r_len=strlen(r);
    base=(char *)malloc(r_len+1);

    for(i=0,j=r_len-1;i<r_len;i++,j--)
    {
        base[j]=r[i];    
    }

    result_temp=(int *)malloc(2*r_len-1);

    for(k=0;k<r_len;k++)
    {
        temp=0;
        i=k;
        j=0;
        while(i>=0)
        {
            temp+=(base[i]-'0')*(base[j]-'0');

            i--;
            j++;
        }
        result_temp[k]=temp;
    }

    for(k=1;k<r_len;k++)
    {
        temp=0;
        i=r_len-1;
        j=k;
        while(i>=0&&j<r_len)
        {
            temp+=(base[i]-'0')*(base[j]-'0');
            i--;
            j++;

        }
        result_temp[r_len+k-1]=temp;
    }

    // debug code
    DebugIntArrayVar("63","result_temp",&result_temp[0],1,2*r_len-1);

    result=(int *)malloc(2*r_len);
    for(i=0;i<2*r_len-1;i++)
    {
        result[i]=result_temp[i];
    }
    result[2*r_len-1]=0;
    for(i=0;i<2*r_len-1;i++)
    {
        result[i+1]+=result[i]/10;
        result[i]%=10;
    }

    for(i=2*r_len-1;i>=0;i--)
    {
        printf("%d",result[i]);
    }
    printf("\n");

    return 0;
}

调试了半天没搞懂为什么多了。但是在标红的地方报的错。希望哪位朋友帮我看看,找找原因,最好能把代码改一下。

[ 本帖最后由 八画小子 于 2014-10-24 02:33 编辑 ]
搜索更多相关主题的帖子: color 
2014-10-24 02:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
    oldContent=newContent;

    asprintf(&newContent,"%s%s :\n",oldContent,varName);
    free(oldContent);
    ^ 这里释放了一次
    oldContent=newContent;
...
            free(oldContent);        // 经调试此处报错。
            ^ 这里又释放一次

释放两次 不会出错么?
2014-10-24 12:46
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
以下是引用zklhp在2014-10-24 12:46:32的发言:

    oldContent=newContent;

    asprintf(&newContent,"%s%s :\n",oldContent,varName);
    free(oldContent);
    ^ 这里释放了一次
    oldContent=newContent;
...
            free(oldContent);        // 经调试此处报错。
            ^ 这里又释放一次

释放两次 不会出错么?

我觉得应该不是释放两次的问题。我之所以贴处了那个比较短小但允许正确对的main()函数,就是为了说明这个问题。另外,我用gdb调试的时候发现,第一次free()之前,oldContent指向了第一个地址,第一次free()之后,这个地址处的内存值被改写成0x0了,在进过两个free()之间的那个赋值后,oldContent指向了一个新的但也比较临近的地址。之后第二次free()就报错了。麻烦你再看看,谢谢。如果能说明一下free()这个函数的运行机制就更好了。
2014-10-24 16:43
快速回复:谢了一个方法,感觉很奇怪,大家看看问题出在哪里了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023414 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved