簡體   English   中英

大型輸入程序崩潰(C)

[英]Program crashes on large inputs (C)

請看一下這個C代碼。 這是我編寫的一個小程序,它以數字n為輸入,並計算2到n之間的所有素數。 當n <100時,它可以正常工作,但是如果我輸入1000或更多,它會崩潰。 我不知道為什么,因為存儲數字的數組是動態分配的,所以內存不足應該不是問題。

那么,為什么程序在大輸入時崩潰?

另外,對於代碼的可讀性不好,我深表歉意。 我只是從編程開始。

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

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<k; i++){
        printf("%d ,", array2[i]);
    }

    printf("%d\n\n", array2[k]);

    free(array2);
    return 0;
}

代碼塊調試器說:程序在第53行收到信號SIGSEGV,分段錯誤。我在代碼中標記了它。

修復過程

  • 使用調試器(始終)查找導致segfault的行
  • 研究涉及的違規變量

在這種情況下,第53行指的是未正確分配的array2訪問。

需要更改

  • 在scanf正確分配n之后,移動array1的分配
  • 更改之前分配malloc返回的array2的分配,返回指針array2的內容,而不是array2(在此階段也未分配)指針
  • 調整分配以使用@alk標識的sizeof(*array1+2)

調整后的代碼

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

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<k; i++){
        printf("%d ,", array2[i]);
    }

    printf("%d\n\n", array2[k]);

    free(array2);
    return 0;
}

另請參見本文有關在c中實現sieve of erastothenes文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM