2014-01-10 3 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에서 'signal 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에서 반환 malloc에'의 값()'과 친구를 캐스팅하지 마십시오 (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은 두 개의 새로운 요소를위한 공간 만 할당 할 것'이라는 의미는 무엇입니까? –

+0

그 괄호 안에 짝수 만 채울 수 있다는 것을 의미합니까? –

+0

아니요, 그 수는 배열 색인이 0에서 시작하기 때문에 요소의 수보다 1이 작은 가장 높은 색인입니다. 따라서 '1'을 (를) 추가해야합니다. 문제를 해결하는 더 좋은 방법은 실제로 호출에 하나를 추가하는 것입니다 :'primePtr = expandMem (primePtr, count + 1);'이것은 expandMem 함수에 더 나은 의미를주기 때문입니다. –