2014-01-10 4 views
0

Я новичок в программировании и вот программа, которая может узнать все простые числа в пределах лимита. Тем не менее, есть ошибка, которая говорит:C - ошибка памяти realloc

Prime 2(1682,0x7fff76316310) malloc: *** error for object 0x1002000a0: incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug' 

Кроме того, Xcode сообщает вопрос говорит: "сигнал SIGABRT. Я подозреваю, что это имеет какое-то отношение к функции realloc. В чем проблема и как исправить код? Спасибо!

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

const int unit=3; 

unsigned long* expandMem(unsigned long *primePtr, unsigned long count){ 
unsigned long* newPtr=(unsigned long*)realloc(primePtr, (count+unit)*sizeof(unsigned long)); 
return newPtr; 
} 


int main(){ 
unsigned long limit; 
unsigned long count=0; 
unsigned long* primePtr=(unsigned long*)malloc(sizeof(unsigned long)*unit); 
*primePtr=2; 

printf("Input the upper limit >>> "); 
scanf("%ld",&limit); 

for (unsigned long int number=3; number<=limit; number+=2) { 
    bool isPrime=true; 
    for (unsigned long i=0; (*(primePtr+i))*(*(primePtr+i))<=number; i++) { 
     if (number%(*(primePtr+i))==0) { 
      isPrime=false; 
      break; 
     } 
    } 
    if (isPrime) { 
     count++; 
     *(primePtr+count)=number; 
     if (count%unit==2) { 
      primePtr=expandMem(primePtr, count); 
     } 
    } 
} 
for (unsigned long i=0; i<=count; i++) { 
    printf("%ld ",*(primePtr+i)); 
} 
} 
+2

[Пожалуйста, не бросайте возвращаемое значение 'таНос()' и друзей, в C] (http://stackoverflow.com/a/605858/28169). Кроме того, для удобочитаемости вы должны * действительно * заменить все случаи '* (p + i)' на 'p [i]'. – unwind

+0

@unwind Должно ли отличное значение realloc()? –

+1

Для начала заменим все вхождение '* (primePtr + x)' на 'primePtr [x]'. Это делается только для улучшения удобочитаемости кода. –

ответ

0

Realloc выделит пространство для 2 новых элементов, но предположим, что он выделяет пространство для 3 новых элементов.

Предложенное изменение (в expandMem):

unsigned long* newPtr=(unsigned long*)realloc(primePtr, (count+1+unit)*sizeof(unsigned long)); 
+0

Спасибо! Модификация работает хорошо. Но что означает «Realloc будет выделять пространство для 2 новых элементов»? –

+0

Вы имеете в виду, что вы можете только заполнить четное число в этой скобке? –

+0

Нет, я имею в виду, что count - это самый высокий индекс, который на один меньше числа элементов, так как индексы массива начинаются с 0. Вот почему вам нужно добавить '1'. Лучшим способом исправить эту проблему было бы, скорее всего, добавить ее в вызов: 'primePtr = expandMem (primePtr, count + 1);' потому что это даст лучшую семантику функции expandMem. –

Смежные вопросы