动态内存阵列使可执行文件崩溃

时间:2014-08-15 02:59:32

标签: c memory malloc

我有这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{

    int num,i,k,tamano,cont=0;

    int *prim;
    scanf("%d",&num);
    num=num+1;
    prim = malloc(num * sizeof(int));


    for(i=1;i<num;i++)
        prim[i] = 1;

    for(i=2;i<=sqrt(num);i++){
        if((prim[i])!=0 ){
        for(k=2;i*k<num;k++)
                prim[k*i]=0;
        }
    }

    for(i=2;i<num;i++)
        if(prim[i])
            printf("%5d",i);

free(num);
}

此代码用于使用Sieve of Eratosthenes算法确定从2到num的素数。

但我有一个问题,当我把可执行程序崩溃的数字放在15时,我不知道是什么问题。如果我使用静态数组,那么程序就可以完美运行,但是当我将动态可执行程序崩溃时,没有明显的理由。

它有什么用?

2 个答案:

答案 0 :(得分:3)

您释放整数num而不是指针prim。你的最后陈述应该是:

free(prim);

释放整数将导致运行时将整数值解释为内存地址并尝试访问它。这会导致执行未知行为,很可能是受保护的内存冲突,这会导致程序崩溃。

答案 1 :(得分:2)

您正在分配prim,然后释放num

您应该只尝试释放已分配的内容。

最后一行应更改为:

free (prim);

一个好的编译器通常会警告你这一点,就像“试图释放一个不是指针的变量”一样。