标题:关于内存释放的问题 (另:谁有大数乘法函数 可以验证一下100的阶乘,看我 ...
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
结帖率:99.76%
已结贴  问题点数:100 回复次数:12 
关于内存释放的问题 (另:谁有大数乘法函数 可以验证一下100的阶乘,看我算的对不对)
百度一下 heap corruption detected 会很多项目 大约知道怎么回事了 不知道咋解决(如何修改代码,可以避免这个错误)

函数如下:
程序代码:

#define max 500
//字符串乘法 乘数与被乘数都是多位数
void strmuls(char* dest1,char* dest2,char* dest3)
{
    char* buffer[max];
    int k;
    for(k=0;k<max;k++) buffer[k]=(char*)malloc(sizeof(char)*max);
    for(k=0;k<max;k++) memset(buffer[k],'\0',max);
    char buf[max]={'\0'};
    strcpy(buf,dest1);
    int len=strlen(dest2);
    int i=0,j=0;
    len--;
    for(;len>=0;len--)
    {
        strmul(dest1,dest2[len]); //自定义函数 计算一个字符串和0--9相乘
        strmovl(dest1,i);         //自定义函数 移位(末尾填'0')
        stralignr(dest1,max);     //自定义函数 是一个对齐函数 空位用'0'补
        strcpy(buffer[i],dest1);
        i++;
        strcpy(dest1,buf);
    }
    int flag=0;
    dest3[max]='\0';
    for(k=max-1;k>=0;k--)
    {
        int tmp=0;
        for(j=0;j<i;j++)
        {
            tmp+=buffer[j][k]-0x30;
        }
        tmp+=flag;
        flag=tmp/10;
        dest3[k]=tmp%10+0x30;
    }
    for(k=0;k<max;k++) free(buffer[k]);
}


我用这个函数计算100!=9332621544394415268169923885626670049071596826438162146859296389521759999322
9915608941463976156518286253697920827223758251185210916864000000000000000000000000
结果貌似没啥错误,就是释放内存会出错

[ 本帖最后由 wp231957 于 2014-3-28 09:55 编辑 ]
搜索更多相关主题的帖子: 项目 如何 百度一下 corruption 
2014-03-28 09:53
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:20 
// 简化一下程序,只觉得memset用的不对,能否给出完整的程序?
#define max 500
#include <stdio.h>
#include <stdlib.h>

//字符串乘法 乘数与被乘数都是多位数
int main()
{
    char* buffer[max];
    int k;
    for(k=0;k<max;k++) buffer[k]=(char*)malloc(sizeof(char)*max);
     //为指针数组的每个元素申请了4个字节  --- 不知道其他函数的内容,也不知道这里申请4个字节是否合适

   for(k=0;k<max;k++) memset(buffer[k],'\0',max);    --- buffer[k]所指向的内存只占4个字节,这里的max是500应该不对了吧?
   
    for(k=0;k<max;k++) free(buffer[k]);
      //释放为指针数组的每个元素所指向的4个字节

    return 0;
}
2014-03-28 10:56
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用ying8501在2014-3-28 10:56:33的发言:


int main()
{
    char* buffer[max];
    int k;
    for(k=0;k<max;k++) buffer[k]=(char*)malloc(sizeof(char)*max);
     //为指针数组的每个元素申请了4个字节  --- 不知道其他函数的内容,也不知道这里申请4个字节是否合适

   for(k=0;k<max;k++) memset(buffer[k],'\0',max);    --- buffer[k]所指向的内存只占4个字节,这里的max是500应该不对了吧?
   
    for(k=0;k<max;k++) free(buffer[k]);
      //释放为指针数组的每个元素所指向的4个字节

}



我是这样理解的

也是一直就这么做的 ,可能一直错了
操作对象:字符串数组
 for(k=0;k<max;k++) buffer[k]=(char*)malloc(sizeof(char)*max);
这个是为每个字符串申请空间  类似 char t[500]
    for(k=0;k<max;k++) memset(buffer[k],'\0',max);
这个是为每个字符串初始化   类似 char t[500]={'\0'}

DO IT YOURSELF !
2014-03-28 11:08
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用ying8501在2014-3-28 10:56:33的发言:

// 简化一下程序,只觉得memset用的不对,能否给出完整的程序?

}


原本想优化的  程序只是实现了功能  还没整理:

程序代码:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define max 500
//字符串右对齐 前导0补齐
void stralignr(char* dest,int slen)
{
    char buffer[max]={'\0'};
    int len1=strlen(dest);
    if(len1>=slen) return;
    strcpy(buffer,dest);
    int bc=slen-len1; 
    while(bc>0)
    {
        *dest++='0';
        bc--;
    }
    int i=0;
    while(buffer[i]!='\0') *dest++=buffer[i++];
    *dest='\0';
}
//字符串乘法 乘数是1位数
void strmul(char* dest,char ad)
{
    int len=strlen(dest);
    int flag=0;
    int tmp;
    len--;
    flag=((dest[len]-0x30)*(ad-0x30))/10;
    dest[len]=((dest[len]-0x30)*(ad-0x30)) %10+0x30;
    while(len>0)
    {
        len--;
        tmp=(dest[len]-0x30)*(ad-0x30)+flag;
        dest[len]=((dest[len]-0x30)*(ad-0x30)+flag)%10+0x30;
        flag=tmp/10;
    }
    char buffer[max];
    memset(buffer,'\0',max);
    strcpy(buffer,dest);
    int j=0;
    dest[j]=flag+0x30;
    j++;
    int i=0;
    while(buffer[i]!='\0') dest[j++]=buffer[i++];
    dest[j]='\0';
}
//字符串左移位右补0
void strmovl(char* dest,int bit)
{
    int len=strlen(dest);
    for(;bit>0;bit--) dest[len++]='0';
    dest[len]='\0';
}
//字符串乘法 乘数与被乘数都是多位数
void strmuls(char* dest1,char* dest2,char* dest3)
{
    char* buffer[max];
    int k;
    for(k=0;k<max;k++) buffer[k]=(char*)malloc(sizeof(char)*max);
    for(k=0;k<max;k++) memset(buffer[k],'\0',max);
    char buf[max]={'\0'};
    strcpy(buf,dest1);
    int len=strlen(dest2);
    int i=0,j=0;
    len--;
    for(;len>=0;len--)
    {
        strmul(dest1,dest2[len]); //自定义函数 计算一个字符串和0--9相乘
        strmovl(dest1,i);         //自定义函数 移位(末尾填'0')
        stralignr(dest1,max);     //自定义函数 是一个对齐函数 空位用'0'补
        strcpy(buffer[i],dest1);
        i++;
        strcpy(dest1,buf);
    }
    int flag=0;
    dest3[max]='\0';
    for(k=max-1;k>=0;k--)
    {
        int tmp=0;
        for(j=0;j<i;j++)
        {
            tmp+=buffer[j][k]-0x30;
        }
        tmp+=flag;
        flag=tmp/10;
        dest3[k]=tmp%10+0x30;
    }
    for(k=0;k<max;k++) free(buffer[k]);
}
int main()
{
    char t1[max]={'\0'};
    char t2[max]={'\0'};
    char t3[max]={'0'};
    char* p=t3;
    char* p2=t3;
    int i;
    int j=0;
    strcpy(t2,"1");
    for(i=2;i<=100;i++)   
    {
        itoa(i,t1,10);
        strmuls(t1,t2,t3);
        while(*p=='0') p++;
        printf("t1=%s  %d!= %s\n",t1,i,p);  //输出2-100的阶乘数
        p=p2;
        memset(t1,'\0',max);
        strcpy(t2,t3);
    }
    return 0;
}



DO IT YOURSELF !
2014-03-28 11:11
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
得分:20 
回复 4楼 wp231957
memset用的没有问题
运行了一下程序,没有报错啊

总有那身价贱的人给作业贴回复完整的代码
2014-03-28 11:16
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用embed_xuel在2014-3-28 11:16:42的发言:

memset用的没有问题
运行了一下程序,没有报错啊



有pp为证:


DO IT YOURSELF !
2014-03-28 11:19
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:0 
不好意思,是我错了。申请的是500个字节。
2014-03-28 12:53
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:20 
向楼主学习
2014-03-28 14:24
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:0 
//字符串乘法 乘数与被乘数都是多位数
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define max 500
//字符串右对齐 前导0补齐
void stralignr(char* dest,int slen)
{
    char buffer[max]={'\0'};
    int len1=strlen(dest);
    if(len1>=slen) return;
    strcpy(buffer,dest);
    int bc=slen-len1;
    while(bc>0)
    {
        *dest++='0';
        bc--;
    }
    int i=0;
    while(buffer[i]!='\0') *dest++=buffer[i++];
    *dest='\0';
}
//字符串乘法 乘数是1位数
void strmul(char* dest,char ad)
{
    int len=strlen(dest);
    int flag=0;
    int tmp;
    len--;
    flag=((dest[len]-0x30)*(ad-0x30))/10;
    dest[len]=((dest[len]-0x30)*(ad-0x30)) %10+0x30;
    while(len>0)
    {
        len--;
        tmp=(dest[len]-0x30)*(ad-0x30)+flag;
        dest[len]=((dest[len]-0x30)*(ad-0x30)+flag)%10+0x30;
        flag=tmp/10;
    }
    char buffer[max];
    memset(buffer,'\0',max);
    strcpy(buffer,dest);
    int j=0;
    dest[j]=flag+0x30;
    j++;
    int i=0;
    while(buffer[i]!='\0') dest[j++]=buffer[i++];
    dest[j]='\0';
}
//字符串左移位右补0
void strmovl(char* dest,int bit)
{
    int len=strlen(dest);
    for(;bit>0;bit--) dest[len++]='0';
    dest[len]='\0';
}
//字符串乘法 乘数与被乘数都是多位数
void strmuls(char* dest1,char* dest2,char* dest3)
{
    char* buffer[max];
    int k;
    int len=strlen(dest2);   //求出乘数的长度   -----稍简化
    int n0=len;

    for(k=0;k<len+1;k++) buffer[k]=(char*)malloc(sizeof(char)*max);

    for(k=0;k<len+1;k++) memset(buffer[k],'\0',max);

    char buf[max]={'\0'};

    strcpy(buf,dest1);   //保留原始被乘数

    int i=0,j=0;
    len--;
    for(;len>=0;len--)
    {
        strmul(dest1,dest2[len]); //自定义函数 计算一个字符串和0--9相乘
        strmovl(dest1,i);         //自定义函数 移位(末尾填'0')
        stralignr(dest1,max-1);     //自定义函数 是一个对齐函数 空位用'0'补
        strcpy(buffer[i],dest1);
        i++;
        strcpy(dest1,buf);
    }

    int flag=0;        //放进位
    dest3[max-1]='\0';        //---这里下标原先超界了
    for(k=max-2;k>=0;k--)
    {
        int tmp=0;
        for(j=0;j<n0;j++)
        {
            tmp+=buffer[j][k]-'0';
        }
        tmp+=flag;
        flag=tmp/10;
        dest3[k]=tmp%10+'0';
    }

  for(k=0;k<n0;k++) free(buffer[k]);
   
}
int main()
{
    char t1[max]={'\0'};
    char t2[max]={'\0'};
    char t3[max]={'0'};
    char* p=t3;
    char* p2=t3;
    int i;
    int j=0;
   
    strcpy(t1,"1");
    for(i=1;i<=100;i++)   
    {
        itoa(i,t2,10);   //给t2赋值:数值转为字符串:2,3,4,乘数
        
        strmuls(t1,t2,t3);
         p=t3; while(*p=='0') p++;

        printf(" %d!= %s\n",i,p);  //输出1-100的阶乘数                           
        
        strcpy(t1,p);      //这里换成t3就出问题不知为什么

    }

    return 0;
}



[ 本帖最后由 ying8501 于 2014-3-28 15:14 编辑 ]
2014-03-28 15:07
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:20 
来赞一个

我行我乐
我的博客:
http://blog.yuccn. net
2014-03-28 16:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-429272-1-1.html




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

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