c-编译通过,程序总是自动停止工作

问题描述

编译通过,程序总是自动停止工作
 #include<stdlib.h>
#include<stdio.h>
//exchange 函数,用来交换两个数
void exchange(int *a,int *b){
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
//快排函数,把数组从A[P]到A[q]进行排序
void Qsort(int A[],int p,int q) {
    int i,j;
    for(i=p,j=p;i<=q-1;){
        if(A[i]<=A[q]){
            exchange(&A[i],&A[j]);
            i++;
            j++;
        }
        else i++;
    }
    exchange(&A[q],&A[j]);
    int a=q;
    q=j-1;
    Qsort(A,p,q);
    p=j;
    q=a;
    Qsort(A,p,q);
}
//主函数
int main()
{//这里先声明了一个数组
    int A[10]={2,6,3,22,56,36,54,25,64,33};
    Qsort(A,0,9);
    int i;
    for(i=0;i<=9;i++){
        printf("%d",A[i]);
    }
    return 0;
}

解决方案

 #include<stdlib.h>
#include<stdio.h>

//快排函数,把数组从A[P]到A[q]进行排序
void Qsort(int A[],int p,int q)
{
    int i = p;
    int j = q;
    int temp = A[i]; 

    if( p < q)
    {
        while(i < j)
        {
            while((A[j] >= temp) && (i < j))
            {
                j--;
            }
            A[i] = A[j];
            while((A[i] <= temp) && (i < j))
            {
                i++;
            }
            A[j]= A[i];
        }
        A[i] = temp;
        Qsort(A,p,i-1);
        Qsort(A,j+1,q);
    }
    else
    {
        return;
    }
}

//主函数
int main()
{//这里先声明了一个数组
    int A[10]={2,6,3,22,56,36,54,25,64,33};
    Qsort(A,0,9);
    int i;
    for(i=0;i<=9;i++){
        printf("%d ",A[i]);
    }
    return 0;
}

解决方案二:

发现应该在exchange(&A[q],&A[j]);后加一个判断条件,确保p小于q之后才能进行递归

改后代码:

 int a=q;
    if(j-1>p){
    q=j-1;
    Qsort(A,p,q);}
    if(j+1<a){
    p=j+1;
    q=a;
    Qsort(A,p,q);}

不过这样代码不太有可读性,按照标准的算法,应该把partion 和Qsort分开,这样逻辑清楚一些

解决方案三:

发现应该在exchange(&A[q],&A[j]);后加一个判断条件,确保p小于q之后才能进行递归

改后代码:

 int a=q;
    if(j-1>p){
    q=j-1;
    Qsort(A,p,q);}
    if(j+1<a){
    p=j+1;
    q=a;
    Qsort(A,p,q);}

不过这样代码不太有可读性,按照标准的算法,应该把partion 和Qsort分开,这样逻辑清楚一些

解决方案四:

一般就是数组越界,内存非法访问

解决方案五:

这种情况一般是数组越界.......

解决方案六:

稍微调试了发现,for循环之后有这么一个交换exchange(&A[q],&A[j]);
这个地方越界了,q=-1的时候有调用交换,所以崩了
楼主再整理下自己的逻辑。。。

时间: 2024-08-15 22:01:21

c-编译通过,程序总是自动停止工作的相关文章

VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题

  使用VS2008编译了一个程序,使用到自己编译的DLL,丢到某些机子上无法运行,提示"由于应用程序配置不正确,应用程序未能启动"的错误,装了vcredist_x86也没有用,开始以为是DLL的问题,后来换个简单的程序,仍然不行,百撕不得其解,后来上网找,下面有说了很多解决办法.         我最终的解决办法是复制本机中的.manifest文件,修改里面的版本号,复制到提示错误的机子上,与可执行程序放在同一目录就可以了.在计算机中管理的系统工具,事件查看器可以查看应用程序的消息,

《操作系统真象还原》——0.18 编译型程序与解释型程序的区别

0.18 编译型程序与解释型程序的区别 解释型语言,也称为脚本语言,如JavaScript.Python.Perl.PHP.Shell脚本等.它们本身是文本文件,是某个应用程序的输入,这个应用程序是脚本解释器. 由于只是文本,这些脚本中的代码在脚本解释器看来和字符串无异.也就是说,脚本中的代码从来没真正上过CPU去执行,CPU的cs:ip寄存器从来没指向过它们,在CPU眼里只看得到脚本解释器,而这些脚本中的代码,CPU从来就不知道有它们的存在.这些脚本代码看似在按照开发人员的逻辑执行,本质上是脚

《C程序设计新思维》一1.7 通过本地文档来编译C程序

1.7 通过本地文档来编译C程序 到此,你应该已经看出编译过程的套路了. 1. 设定一个表述编译器选项的变量. 2. 设定一个表述连接器选项的变量,包括为你用的所有库配置的-l选项. 3. 用make命令或者你的IDE的操作来把这些变量转换为完整的编译和连接命令. 本章的余下部分将把以上步骤做最后一次,并采取一种非常简短的设置:仅仅用shell.如果你思维敏捷,可以通过摘录一些语句段落到解析器上来学习脚本,你也将可以同样地把C代码贴在你的命令行上.**1.7.1 在命令行里包含头文件**gcc和

在Linux上编译iOS程序

phpwind appcreator是向站长提供的自助app生成平台,目前只支持Android,为了支持iOS,搜了一些相关资料,发现可以在Linux上来编译iOS程序,但最后的签名什么的还没细究. 主要用到了一些cjacker移植的工具链(应该是基于苹果公司开源的一些代码),以及他开发的iphonesdk-utils(主要是一些辅助工具,比如ios-clang,会探测iPhone SDK,并自动加上一些参数来调用clang,避免自己手写很多参数,比如 --target 等). 介绍下具体步骤:

抽取VS文件组成类GCC的编译器并编译C程序为dll动态链接库

用惯了linux下的GCC编译工具,倒喜欢起命令行的方式编译链接C程序,居然还发现我装的VS工具没看到直接编译C程序的工具(我不太熟悉这个).VS的编译文件命令是cl,链接命令是link.参考了网上资料,采用提取VS的编译器文件组成一个可以命令行方式编译程序的工具.以下为步骤: 1,在自己目录创建文件夹,如:D:/vctool; 2,将VS安装目录下的VC目录下的bin.lib.include目录考到vctool目录下: 3,将c:/Program Files/Microsoft SDKs/Wi

VS 2005编译的程序不能运行的几个解决方法

这两天有点焦头烂额, 我们这边运行的好好的程序, 到了测试的机器上就不能启动(是根本运行不了, 而不是运行出错), 弄得我异常郁闷. 经过了一番摸索, 发现和 winxp.win2003中为解决dll hell而引入的manifest机制有关系.而以前我们用vs2003开发, 它并没有强制程序使用manifest, 但到了vs2005中, 这已经改成必需的了, 而我们并没有按照需要进行相关的配置, 所以程序启动不了了. 根据目前的经验, vs2005编译的程序不能启动大致有两个原因, 下面简单介

在Visual Studio 2008中编译F#程序

在Visual Studio 2008中,编译F#程序时,会出现警告(但不是错误),但是由于这个警告却使你的程序无法运行,不过大多数据这些警告都会有提示,提示你用.NET里的函数代替F#中的某些函数,但是这些.NET中的函数又不能像在C#中那样使用. 例如: #light let one = ["one "] let two = "two " :: one let three = "three " :: two let rightWayRound

vs2012编译的程序不能在XP和2003下执行问题的解决方法

问题如题,通过无数次百度和谷歌后,发现,微软已经确认这是一个缺陷,安装Vs2012的update 3的升级包就可以解决问题. 同时,在分发包的地方,vcredist_x86.exe 随程序分发一份就可以了. 同时记着把调试模式下的dll带上,debug模式下的dll为 msvcr110d 这样软件就可以在2003和xp下面尽情的run了!vs2012的硬伤从此修复. vs2012的升级安装包在线安装程序为:VS2012.3 ------------------- 当然了,也可以将msvcrt的库

“提示该程序已停止工作”解决方法

  "打开某程序无任何反应即提示该程序已停止工作"解决方法 解决方法: 1右击计算机-属性(如没有计算机选项,可以让用户在左下角开始-计算机-属性也可),选择左上方的高级系统设置. 2选择"高级",再选择性能栏里的"设置" 3选择"数据执行保护",选择"为除下列选定程序之外的所有程序和服务启用DEP(U)",再点击下方的"添加"从硬盘中选中该程序即可.