2 thuzhangga thuzhangga 于 2016.01.28 23:45 提问

程序运行到某个过程停止?

代码如下:

#include"stdlib.h"
#include"malloc.h"
int *add(int *a,int *b)
{
    int digit1=_msize(a)/4;
    int digit2=_msize(b)/4;
    int digit=_msize(a)/4>=_msize(b)/4?_msize(a)/4:_msize(b)/4;
    printf("enter:a=");
    for(int i=0;i<digit1;i++)
        printf("%d",a[i]);
    printf(" b=");
    for(int i=0;i<digit2;i++)
        printf("%d",b[i]);
    int *re=(int *)calloc(digit+1,4);
    int *d=(int *)calloc(digit+1,4);
    int *e=(int *)calloc(digit1,4);
    for(int i=0;i<digit2;i++)
        e[i]=b[i];
    for(int i=0;i<digit;i++)
    {
        d[i+1]=(a[i]+e[i])/10;
        re[i]=(a[i]+e[i]+d[i])%10;
    }
    re[digit]=d[digit];
    free(d);
    free(e);
    if(re[digit]==0)
    {
        realloc(re,digit*4);
        printf(" out: ");
        for(int i=0;i<digit;i++)
            printf("%d",re[i]);
        printf("\n");
        return re;
    }
    else 
    {
        printf(" out:");
        for(int i=0;i<digit+1;i++)
            printf("%d",re[i]);
        printf("\n");
        return re;
    }
}
void main()
{
    int *fr=(int *)malloc(sizeof(int));
    fr[0]=1;
    int *af=(int *)malloc(sizeof(int));
    af[0]=1;
    while(true)
    {
        int *temp=fr;
        fr=af;
        af=add(af,temp);
        if(_msize(af)/4==1000)
        {
            for(int j=0;j<(_msize(af)/4);j++)
            printf("%d",af[j]);
            break;
        }
    }
}

任务是找出首个达到1000位的斐波那契数。
数太大,不可能直接操作,我用数组来表示数,方便起见我将数倒着存入数组。
但是呢我运行了几次,前面都没问题,运行到814491和393021(对应数为194481和1210393)就卡住不动了~求问怎么回事呢?

3个回答

caozhy
caozhy   Ds   Rxr 2016.01.29 05:46
已采纳
 #include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"string.h"

void Add(char a[],char b[],char d[])
{
    char c[1200];
    int lena=strlen(a),lenb=strlen(b);
    int i,len;
    len=lena>lenb?lena:lenb;
    len++;
    c[0]='\0';
    for(i=1;i<=len;i++)c[i]='0';
    for(i=1;i<=lena;i++)c[i]+=a[lena-i]-48;
    for(i=1;i<=lenb;i++)c[i]+=b[lenb-i]-48;
    for(i=0;i<=len;i++)
        if(c[i]>57)
    {
            c[i]-=10;
            c[i+1]++;
        }

    for(i=len;i>1;i--)
        if(c[i]==48)len--;
        else break;
     for(i=0;i<=len;i++)
        d[i]=c[len-i];
}

void main()
{
    char a[1200];
    char b[1200];
    char c[1200];
    a[0] = '1';
    a[1] = '\0';
    b[0] = '1';
    b[1] = '\0';
    int i = 3;
    while (true)
    {
        Add(a, b, c);
        if (strlen(c) >= 1000) break;
        i++;
        strcpy(a, b);
        strcpy(b, c);
    }
    printf("%d\n", i);
    printf("%s\n", c);
}
caozhy
caozhy   Ds   Rxr 2016.01.29 05:46
 4782
10700662663827589367649805844573968850836838966321516650132352033753145206046940
40621889147582489792657804694888177591957484336466672569959512996030461262748092
48218614406943305123477444275027378175308757939166619214925918675955396642283714
89431130746995034395470019854326097230672901928705264472437261177158218255484911
20525013201478612965931381792235559657452039506137551467837543229119602129934048
26070617539770684706820289548690266618543512452190036948064135744747091170761976
69456910700980243934396174741037369125032313655321647736970231677550515951735184
60579954919410967778373229665796581646513903488154256310184224190259846088000110
18625555024549393711365165703944762958471454852342595042858242530608354443542821
26110089928637950480068943303097732178348645431132057656598684562886168087186938
35297350643986297640660000723562917905207051164077614812491885830945940566688339
10935094445657635766615161931775379289166158132715961687748798382182049252034847
3874384736771934512787029218636250627816
Press any key to continue
91program
91program   Ds   Rxr 2016.01.29 09:10

new 来的内存,最后都不释放的?

thuzhangga
thuzhangga 但是很感谢您的解答
2 年多之前 回复
thuzhangga
thuzhangga 不好意思。。。我在我原来的函数add里只是释放两个中间变量,如果结果释放了最后return不了,而在主函数里那些内存也不能释放吧。。?
2 年多之前 回复
91program
91program 不好意思,是 malloc。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
python里怎么终止程序的执行?
python里怎么终止程序的执行?   import sys sys.exit(0)     Or you can use: raise SystemExit   If you are using IDLE: just use "quit()"
类加载过程和反射机制使用详解
1.类的加载当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。加载就是指将class文件读入内存,并为之创建一个Class对象。 任何类被使用时系统都会建立一个Class对象。连接验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 static{}语句块 解析 将类的二进制数据中的符号
C++ 程序稳定运行一段时间后异常中止,为什么?vc6 运行库的bug!!!
最近发现Visual C++ 6.0有一个有趣的,能让programmer发疯的bug。Debug版本编译出来的程序可能最终会异常中止,也许是报告程序停在断点xxxxxxx。更确切地说是用debug 版本的运行时库编译的程序。 由于项目需要写了一个求最短路径的引擎。 运行稳定(内存,CPU,Handle count 保持未定),但是一段时间后,进程突然退出(crash?)。确切地说是计算了20
【IDE-Visual Studio】vs2010 -MFC-查看程序执行过程
例子: CApp::OnFileNew() CDoc::OnNewDocument() 设置断点方式如下: 执行顺序 6-8-19-24-11,想拿app的数据则将第6行代码往下移!
jq中如何阻止程序的运行
在我们写jq的时候,当数据满足一定的条件时,我们想要阻止程序的运行,并且给出相应的提示,我们可以用简单的方法,return false;就可以实现,下面就为大家举一个实例。 //首先引入jq文件,我用的是tp框架           //首先我们可以为元素绑定一个事件,我这里就以 click 点击为例吧           $('img').click(funct
Linux 停止当前正在运行程序
1、终端执行shell命令 得到进程PID ps -e | grep ‘test’ | awk ‘{print $1}’ 12478 其中test为进程名 杀进程 kill -9 12478 2、代码 #include <stdio.h> #include <string.h> #include <stdlib.h> void stop(
程序运行流程——链接、装载及执行
在阅读完《深入理解计算机系统》第一章(计算机系统漫游)、第七章(链接)以及第十章(虚拟存储器)和《程序员的自我修养——链接、装载与库》后,历时悠久的梦想终于要实现了。开篇之初,首先提出一个迷惑了很久的一个问题:什么是虚拟存储器?它跟进程的虚拟地址空间有什么关系? 虚拟存储器是建立在主存--辅存物理结构基础上,有附加的硬件装置及操作系统存储管理软件组成的一种存储体系。
Windows程序设计(SDK)窗口过程---程序 的关闭
/* 程序的关闭: 点击右上角 叉叉按钮 会发送 WM_CLOSE消息 (如果 需要 判断 用户是否确定 关闭 需要 捕获 WM_CLOSE消息 然后询问 然后 IDYES后 就执行DestroyWindow函数) 再执行DestroyWindow()函数 发送 WM_DESTROY消息 然后 就关闭的窗口 此时 再 执行 PostQuitMessage(0)
C语言里程序编译无误但运行会弹出程序已停止运行是为什么?
C语言里程序编译无误但运行会弹出程序已停止运行是为什么?原文链接(https://zhidao.baidu.com/question/1178139670043658699.html) 摘要 1. 内存溢出 内存溢出(out of memory)通俗理解就是内存不够,程序所需要的内存远远超出了主机内安装的内存所承受大小,就叫内存溢出。系统会提示内存溢出,有时候会自动关闭软
分析java程序的运行过程
我们知道,java语言程序的一大特性就是跨平台特性,那么java这种“一次编写,到处运行”的特性到底是怎样实现的呢,一个java程序的运行过程到底是怎样的呢,下面我们来通过一个简单的java程序来说明, 1.首先,先写一个java类为 HelloWorld.java 源文件如下: public class HelloWorld{     public static void main(Str