2017-01-23 5 views
0

Оператор realloc во второй функции работает до точки, тогда указатель, кажется, внезапно указывает на случайную память. Может кто-нибудь объяснить, как я могу исправить эту проблему? Взгляните на результат, чтобы сэкономить некоторое время. Спасибо.Указатель Realloc указывает на случайную память, сбрасывает программу

int main() 
{ 

    int testCases, i, n; 
    int* primeArray; 
    int* size; 

    primeArray = malloc(sizeof(int)); 
    primeArray[0] = 2; 
    size = 1; 

    int number = 2; 
    while(number < 1000){ 
     number = nextPrime(number, primeArray, &size); 
     printf("Prime Array at %d is %d, size is %d, number is %d \n", 0, primeArray[0], size, number); 
    } 


    scanf("%d", &testCases); 
    for(i = 0; i < testCases; i++){ 
     scanf("%d", n); 

    } 

    free(primeArray); 
    free(size); 
    return 0; 
} 

Вторая функция:

int nextPrime(int number, int* primeArray, int* size){ 
    int foundPrime = 0, num = number, i; 
    while(!foundPrime){ 
     num++; 
     int allNums = 0; 
     //printf("Size: %d \n", *size); 
     for(i = 0; i < *size; i++){ 
      //printf("%d mod %d \n", num, primeArray[i]); 
      if(num % primeArray[i] != 0){ 
       allNums += 0; 
      } 
      else { 
       allNums = 1; 
       break; 
      } 
     } 
     if(allNums == 0){ 
      *size+=1; 
      //printf("Size: %d \n", *size); 
      foundPrime = 1; 
      primeArray = realloc(primeArray, *size * sizeof(int)); 
      primeArray[*size-1] = num; 
      //printf("%d \n", primeArray[*size-1]); 
      return num; 
     } 
    } 
} 

Выход:

Prime Array at 0 is 2, size is 2, number is 3 
Prime Array at 0 is 2, size is 3, number is 5 
Prime Array at 0 is 2, size is 4, number is 7 
... 
Prime Array at 0 is 2, size is 94, number is 491 
Prime Array at 0 is 2, size is 95, number is 499 
Prime Array at 0 is 2, size is 96, number is 503 
Prime Array at 0 is 16852008, size is 97, number is 509 
+1

Конечно 'ИНТ * размер; ... размер = 1;' генерируется предупреждение компилятора. Скомпилируйте снова, включив все предупреждения. – chux

+0

Off topic - ваша петля в 'nextPrime' может быть сделана намного быстрее, если вы пропустили все четные числа. Это инкремент, 'num' на 2 вместо' num ++ 'на каждой итерации. Вы также можете закончить свой цикл раньше, когда 'num> sqrt (primeArray [last]' – selbie

ответ

1

primeArray, хотя это указатель, передается по значению вашей функции nextPrime. Поэтому, если realloc изменяет значение указателя (как может и часто будет), main не возвращает это значение, возвращенное к нему, когда возвращается nextPrime. Быстрое исправление будет заключаться в изменении вашего nextPrime, чтобы взять указатель на указательный параметр вместо указателя массива.

Вот краткое исправление, в котором я модифицировал подпись функции nextPrime и добавил код к началу и концу функции.

int nextPrime(int number, int** ptrToPrimeArray, int* size){ 

    int* primeArray = *ptrToPrimeArray; // primeArray is the deferenced value of ptrToPrimeArray 

    int foundPrime = 0, num = number, i; 
    while(!foundPrime){ 
     num++; 
     int allNums = 0; 
     //printf("Size: %d \n", *size); 
     for(i = 0; i < *size; i++){ 
      //printf("%d mod %d \n", num, primeArray[i]); 
      if(num % primeArray[i] != 0){ 
       allNums += 0; 
      } 
      else { 
       allNums = 1; 
       break; 
      } 
     } 
     if(allNums == 0){ 
      *size+=1; 
      //printf("Size: %d \n", *size); 
      foundPrime = 1; 
      primeArray = realloc(primeArray, *size * sizeof(int)); 
      primeArray[*size-1] = num; 
      //printf("%d \n", primeArray[*size-1]); 

      *ptrToPrimeArray = primeArray; // return the changed value of primeArray back to the caller 

      return num; 
     } 
    } 
} 

И затем вызвать его в main следующим образом:

number = nextPrime(number, &primeArray, &size); 
1

Вы присваиваете значение, возвращаемое realloc() к локальной переменной, которая, конечно, ушел, когда функция nextPrime() возвращение. Значение primeArray в main() никогда не меняется.