程序给出正确答案后释放C中内存时出错

程序给出正确答案后释放C中内存时出错,c,arrays,dynamic,calloc,C,Arrays,Dynamic,Calloc,这是primessieve的代码,它给出了正确的输出,完全符合我的要求,除了在打印正确的结果后出现的错误 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <math.h> void prime_gen(int *, int); void show_primes(unsigned long, unsigned long, int *, int); int ma

这是primessieve的代码,它给出了正确的输出,完全符合我的要求,除了在打印正确的结果后出现的错误

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

void prime_gen(int *, int);
void show_primes(unsigned long, unsigned long, int *, int);

int main(void)
{
  int no_testcases=0;
  int count=0;
  unsigned long lower=0,upper=0;
  unsigned long size;

  size=sqrt(1000000000);
  printf("%lu\n", size);
  int * primes, *primes_temp;;
  primes=(int *)calloc(size+1,sizeof(int));
  assert (primes!=NULL);

  prime_gen(primes, size+1); /* generates array of 0 and 1's indicating if index is a prime number */

  scanf("%d", &no_testcases); /* no of test cases */
  while (count<no_testcases)
  {
    scanf("%lu %lu", &lower, &upper);
    show_primes(lower, upper, primes, size+1); /* shows all prime numbers in given range */
    count++;
    if (count!=no_testcases)
      putchar('\n');
  }

  free(primes);

  return 0;
}
下面是素数生成器和show_素数的代码:

void prime_gen(int * tab, int size) /* 0== is prime, 1== is not prime */
{
  tab[0]=1;
  tab[1]=1;
  unsigned long index=2;
  unsigned long set_index;


  for(index=2;index<=size;index++)
  {
    while (index<=size && tab[index]!=0) /* goes to next prime number */
    {
      index++;
    }
    for(set_index=index+index;set_index<=size;set_index+=index)
      tab[set_index]=1;
  }
  printf("size=%d, set_index=%lu, index=%lu\n", size, set_index, index);
}

void show_primes(unsigned long l, unsigned long u, int * array, int size)
{
  int index = 0;
  int is_prime=1;
  int primes_count=0;

  for(l;l<=u;l++)
  {
    if (l<=size) /* if l is valid index of array with primes */
    {
      if(array[l]==0)
      {
    printf("%lu\n", l);
    primes_count++;

      }
    }
    else /* if checked number is bigger than last index of array */
    {
      is_prime=1;
      for (index=2;index<=size;index++)
      {
    if (array[index]==0)
    {
      if (l%index==0)
      {
        is_prime=0;
        break;
      }
    }
      }
      if (is_prime)
      {
    printf("%lu\n", l);
    primes_count++;

      }
    }

  }
  printf("No of primes = %d\n", primes_count);
}
void prime\u gen(int*tab,int size)/*0==是prime,1==不是prime*/
{
表[0]=1;
表[1]=1;
无符号长索引=2;
无符号长集索引;
对于(index=2;index我的猜测:

void prime_gen(int *, int);
void show_primes(unsigned long, unsigned long, int *, int);

int main(void)
{
  int no_testcases=0;
  int count=0;
  unsigned long lower=0,upper=0;
  unsigned long size;

  size=sqrt(1000000000);
  printf("%lu\n", size);
  int * primes, *primes_temp; *primes_head;
  primes=(int *)calloc(size+1,sizeof(int));
  primes_head = primes;
  assert (primes!=NULL);

  /* NOTE CHANGE BELOW */
  prime_gen(primes, size); /* generates array of 0 and 1's indicating if index is a prime number */

  scanf("%d", &no_testcases); /* no of test cases */
  while (count<no_testcases)
  {
    scanf("%lu %lu", &lower, &upper);
    /* NOTE CHANGE HERE */
    show_primes(lower, upper, primes, size); /* shows all prime numbers in given range */
    count++;
    if (count!=no_testcases)
      putchar('\n');
  }

  free(primes_head);

  return 0;
}
void prime\u gen(int*,int);
void show_素数(无符号长、无符号长、int*、int);
内部主(空)
{
int no_testcases=0;
整数计数=0;
无符号长下限=0,上限=0;
无符号长尺寸;
尺寸=平方米(100000000);
printf(“%lu\n”,大小);
整数*素数,*素数温度;*素数头;
素数=(int*)calloc(size+1,sizeof(int));
素数头=素数;
断言(素数!=NULL);
/*注意下面的变化*/
prime_gen(primes,size);/*生成0和1的数组,指示索引是否为素数*/
scanf(“%d”,无测试用例);/*无测试用例*/

当(count尝试移动
scanf(“%lu%lu”、&lower、&upper);
prime\u gen
函数中循环外时,您有以下功能:

for(set_index=index+index;set_index<=size;set_index+=index)
  tab[set_index]=1;

for(set_index=index+index;set_index使用
primes
数组和数组大小调用
primes\u gen
show_primes
。在这些函数中,通过数组边界读取和写入一个:

for(set_index=index+index;set_index<=size;set_index+=index)
  tab[set_index] = 1;

for(set_index=index+index;set_index程序退出时将释放所有内存,因此快速解决方案是让它退出。;)问题:您是否使用任何优化或奇怪的设置进行编译?您确定没有在show_primes函数中释放素数吗?您还可以将该代码放入吗?show定义
prime_gen
show_primes
。您正在索引数组,其大小输入为“size+1”将所有参数都索引到@Jim,就是这样。将参数从(size+1)更改为(size)修复了代码。没有更多信息,还不清楚。可能show_primes正在更改primes ptr…正如您所看到的,*primes_temp是我尝试执行相同操作的剩余部分。没有成功。您正在使用代码对primes进行控制/覆盖。它可以工作,但指针已损坏。Prime_gen(primes,size)不是size+1
for(set_index=index+index;set_index<=size;set_index+=index)
  tab[set_index] = 1;