热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序在大输入上崩溃(C)-Programcrashesonlargeinputs(C)

PleasetakealookatthisCcode.ItisasmallprogramIvewritten,whichtakesanumbernasinp

Please take a look at this C code. It is a small program I've written, which takes a number n as input and calculates all prime numbers from 2 to n. It works fine when n<100, but if I put in 1000 or more it crashes. I can't figure out why, since the array, in which the numbers are stored is dynamically allocated, so lack of memory shouldn't be a problem.

请看一下这个C代码。这是我编写的一个小程序,它以n为输入,计算从2到n的所有素数。当n <100时它工作正常,但如果我输入1000或更多,它会崩溃。我无法弄清楚为什么,因为存储数字的数组是动态分配的,所以缺少内存应该不是问题。

So, why does the program crash on large inputs?

那么,为什么程序会在大输入上崩溃?

Also, I apologize for the bad readability of the code. I'm just starting out with programming.

另外,我为代码的可读性差而道歉。我刚刚开始编程。

code

#include 
#include 

int main()
{
    int i;
    int n;
    int *array = malloc((n-1)*sizeof array);
    int q = 0;
    int k;
    int *array2;

    printf("Geben Sie eine natuerliche Zahl n ein: ");
    scanf("%d", &n);
    printf("\n");

    for(i=0; i<=n-2; i++){
        array[i] = i+2;
    }

    while(q<=n-2){
        while(array[q]==0&&q<=n-2){
            q++;
        }
        for(i=q+1; i<=n-2; i++){
            if(array[i]%array[q]==0){
                array[i] = 0;
            }
        }
        q++;
    }

    PART1:
    for(i=0; array[i]!=0; i++){
        if(array[i+1]==0){
            int j;
            for(j=i+1; j<=n-2; j++){
                if(array[j]!=0){
                    array[i+1] = array[j];
                    array[j] = 0;
                    goto PART1;
                }
            }
            k = i;
            goto PART2;
        }
    }

    PART2:
    *array2 = malloc((k+1)*sizeof array2);

    for(i=0; i<=k; i++){
        array2[i]=array[i];    //Here's where the program crashes
    }

    free(array);

    for(i=0; i

codeblocks debugger says: program received signal SIGSEGV , Segmentation fault, at line 53. I marked it in the code.

codeblocks调试器说:程序接收信号SIGSEGV,分段错误,在第53行。我在代码中标记了它。

1 个解决方案

#1


process to fix

修复过程

  • use a debugger ( always ) to find the line causing segfault
  • 使用调试器(总是)来查找导致段错误的行

  • study the offending variables involved
  • 研究涉及的违规变量

In this case, line 53 was referring to an array2 access which was not properly allocated..

在这种情况下,第53行指的是未正确分配的array2访问。

changes required

  • move allocation of array1 after the scanf has properly assigned n
  • 在scanf正确分配n后移动array1的分配

  • change the allocation of array2 which was previously assigning malloc return to the contents of the pointer array2 instead of array2 ( which at this stage was also unallocated ) pointer
  • 更改以前分配malloc的array2的分配返回指针array2的内容而不是array2(在此阶段也是未分配的)指针

  • adjust allocation to use sizeof(*array1+2) as identified by @alk
  • 调整分配以使用由@alk标识的sizeof(* array1 + 2)

adjusted code

#include 
#include 

int main(int argc, char *argv[])
{
    int i, n, q = 0, k, *array2;

    printf("Geben Sie eine natuerliche Zahl n ein: ");
    scanf("%d", &n);
    int *array = malloc((n-1)*sizeof(*array));
    printf("\n");

    for(i=0; i<=n-2; i++){
        array[i] = i+2;
    }

    while(q<=n-2){
        while(array[q]==0&&q<=n-2){
            q++;
        }
        for(i=q+1; i<=n-2; i++){
            if(array[i]%array[q]==0){
                array[i] = 0;
            }
        }
        q++;
    }

    PART1:
    for(i=0; array[i]!=0; i++){
        if(array[i+1]==0){
            int j;
            for(j=i+1; j<=n-2; j++){
                if(array[j]!=0){
                    array[i+1] = array[j];
                    array[j] = 0;
                    goto PART1;
                }
            }
            k = i;
            goto PART2;
        }
    }

    PART2:
    array2 = malloc((k+1)*sizeof(*array2));

    for(i=0; i<=k; i++){
        array2[i]=array[i];    //Here's where the program crashes
    }

    free(array);

    for(i=0; i

See also this article on implementing sieve of erastothenes in c.

另见关于在c中实施erastothenes筛的本文。


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
author-avatar
菜蕻的薇笑2602929033
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有