2015-07-27 4 views
-2

Я пишу код для вычисления суммы значений фибоначчи до n, как хранится в массиве. Для некоторых значений n я получаю ошибку при вызове free().Ошибка при освобождении памяти

Редактировать: Код должен теперь компилироваться.

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

long fib(long *fibs, int n); 

int main(int argc, char *argv[]) { 

    long num, sum; 
    long n; 
    long *fibs; 

    if(argc < 2) { 
    printf("Usage %s n\n", argv[0]); 
    exit(EXIT_SUCCESS); 
    } 

    n = strtol(argv[1], NULL, 10); 
    printf("%ld\n", n); 

    printf("--Allocating memory\n"); 
    fibs = (long *) malloc(sizeof(long) * n); 
    printf("--Memory allocated\n"); 

    fibs[0] = 1; 
    fibs[1] = 1; 

    sum = 0; 
    for(int i = 0; i <= n; i++) { 
    num = fib(fibs, i); 
    sum += num; 

    printf("%ld\n", num); 
    } 

    printf("%ld\n", sum); 

    printf("--Freeing memory\n"); 
    free(fibs); 
    printf("--Memory freed\n"); 
} 

long fib(long *fibs, int n) { 
    if((n == 0) || (n == 1)) { 
    return 1; 
    } 

    fibs[n] = fibs[n - 1] + fibs[n - 2]; 
    return fibs[n]; 
} 

Например, когда я вызываю программу ./fibsum с n = 5, я получаю дамп ядра.

+1

Что такое 'n' в основном? пожалуйста, напишите минимальный компилируемый код, есть так много проблем в вашем коде –

+2

должно быть

+1

Не бросайте возврат malloc. И вы должны инициализировать фибры при объявлении. Также это не объявляет, поэтому я не уверен, как он компилируется –

ответ

1

Как я говорил вам в комментариях, вы переполнены при использовании < = вместо < в петле. Взгляните на следующий пример, это отнюдь не попытка быть «очищенной» версией вашего кода, я просто заставлял его работать, не меняя слишком многого.

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

int number = 300; 

long* fib(long* fibs, int n) 
{ 
    if (n == 0 || n == 1) 
    { 
     fibs[n] = 1; 
    } 
    else 
    { 
     fibs[n] = (fibs[n-1] + fibs[n-2]); 
    } 
    return fibs; 
} 

int main(int argc, char *argv[]) 
{ 
    long* fibs = (long*)malloc(number * sizeof(long)); 
    long sum = 0; 

    for (int i = 0; i < number; ++i) //changed <= to < like i said in the comments 
    { 
     sum += fib(fibs, i)[i]; 
     printf("%d\n", sum); 
    } 

    printf("\n\nSum of everything: %ld\n", sum); 
    free(fibs); //no problem 

    return 0; 
} 
2

Линии

fibs[n] = 1; 

и

fibs[n] = fibs[n - 1] + fibs[n - 2]; 

изменить память вне правового диапазона. Юридический диапазон: fibs[0] - fibs[n-1]. В связи с этим программа отображает неопределенное поведение. В вашем случае неопределенное поведение проявляется в форме проблемы при вызове free.

Возможно, вы захотите выделить еще один элемент, который вы сейчас выделяете. Вместо

fibs = (long *) malloc(n * sizeof(n)); 

использования

fibs = malloc((n+1) * sizeof(n)); 

увидеть SO пост на why you should not cast the return value of malloc.

+0

Почему он использовал if ((n == 0) || (n == 1)), что означает, что n-1 будет индексом 1, а n-2 будет индексом 0 или мне что-то не хватает –

+0

@CamelToe, Я не последовал твоему вопросу. –

+0

_modify память за пределами правового диапазона_ как? @RSahu –

1

Есть ряд проблем -

  1. i не декларируется в main.
  2. n не указан в main.
  3. И самое важное это петлям

    for(i = 0; i <= n; i++) 
    

Как выделить память для n пунктов, но петля идет от 0 к n .Вы забыли это должно быть до поведения n-1 .Таким образом не определено.

Как вы описали (n=5, так что петля должна быть от 0 to 4).

0

Есть несколько проблем в вашем коде, некоторые из них опечатка я думаю, некоторые из них логическая проблема:

  • Вы забыли ввести n и i

  • Никогда не приводите malloc, так что вместо fibs = (long *) malloc(n * sizeof(n)); попробовать fibs = malloc(n * sizeof(long));

  • В цикл, вместо for(i = 0; i <= n; i++) использования for(i = 0; i < n; i++)

  • sum += fib(fibs, i); здесь, sum является long но fib() возвращает long *, поэтому изменить функцию растрата long *fib(long *fibs, int n) к long fib(long *fibs, int n)

я обновить свой код, то run и получить результат: .

Измененный код:

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

long fib(long *fibs, int n) { 
    if((n == 0) || (n == 1)) { 
     fibs[n] = 1; 
    } else { 
     fibs[n] = fibs[n - 1] + fibs[n - 2]; 
    } 
    return fibs[n]; 
} 

int main(int argc, char *argv[]) { 
    long *fibs; 
    long sum = 0; 
    int n = 6, i; 
    fibs = malloc(n * sizeof(long)); 
    long tem; 

    for(i = 0; i < n; i++) { 
     tem = fib(fibs, i); 
     sum += tem; 
    } 

    printf("%ld\n", sum); 
    free(fibs); 
} 
Смежные вопросы