我有这段代码:
#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时,我不知道是什么问题。如果我使用静态数组,那么程序就可以完美运行,但是当我将动态可执行程序崩溃时,没有明显的理由。
它有什么用?
答案 0 :(得分:3)
您释放整数num
而不是指针prim
。你的最后陈述应该是:
free(prim);
释放整数将导致运行时将整数值解释为内存地址并尝试访问它。这会导致执行未知行为,很可能是受保护的内存冲突,这会导致程序崩溃。
答案 1 :(得分:2)
您正在分配prim
,然后释放num
。
您应该只尝试释放已分配的内容。
最后一行应更改为:
free (prim);
一个好的编译器通常会警告你这一点,就像“试图释放一个不是指针的变量”一样。