程序因大输入而崩溃(C)

程序因大输入而崩溃(C),c,crash,C,Crash,请看一下这个C代码。这是我写的一个小程序,它以一个数字n作为输入,计算从2到n的所有素数。当n处理修复时,它工作正常 使用调试器(始终)查找导致segfault的行 研究涉及的违规变量 在这种情况下,第53行指的是未正确分配的array2访问 需要更改 在scanf正确分配n后移动阵列1的分配 更改之前将malloc return分配给指针array2而不是array2(在此阶段也是未分配的)指针内容的array2的分配 调整分配以使用@alk标识的sizeof(*array1+2) 调

请看一下这个C代码。这是我写的一个小程序,它以一个数字n作为输入,计算从2到n的所有素数。当n处理修复时,它工作正常

  • 使用调试器(始终)查找导致segfault的行
  • 研究涉及的违规变量
在这种情况下,第53行指的是未正确分配的
array2
访问

需要更改

  • 在scanf正确分配n后移动阵列1的分配
  • 更改之前将malloc return分配给指针array2而不是array2(在此阶段也是未分配的)指针内容的array2的分配
  • 调整分配以使用@alk标识的
    sizeof(*array1+2)
调整后的代码

#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;
}
#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;
}
#包括
#包括
int main(int argc,char*argv[])
{
int i,n,q=0,k,*array2;
printf(“你的名字是什么?”);
scanf(“%d”和“&n”);
int*数组=malloc((n-1)*sizeof(*数组));
printf(“\n”);

对于(i=0;i什么类型的崩溃?您是否尝试过调试器来确定崩溃的确切位置/方式?使用gdb查看崩溃的位置并发布。一个问题是,
基于(未定义的n)分配数组
在你扫描n之前。同样,数组的内容在你的第一个循环中是未定义的。codeblocks调试器说:程序在第53行收到信号SIGSEGV,分段错误。我在代码中标记了它。但我不知道它是什么意思。如果你看这行它崩溃了,它正试图访问
array2
。然后检查你是如何操作的已分配的
array2
(与array1相比)
*array2=…
Um。这不应该是
array2=…
?并且编译器没有警告您将
void*
保存到
int
,或者至少是“此处使用的未初始化的array2”?