Как в этом случае использовать функцию free ()? используя mallo c () и reallo c () - PullRequest
0 голосов
/ 07 августа 2020

Не могли бы вы сказать мне, где мне нужно поместить функцию free () для массива "arr" в этом коде? Я попытался поставить free (arr) перед последней printf (), но таким образом мой вывод неверен. Я также пытаюсь проверить, свободна ли выделенная память.

int *boh(int *arr,int n);

int main() {
    int a,i,n;
    int *arr;
    int *b;
    int size = 6;

    arr = (int*) malloc(size* sizeof(int));

    for (i= 0; i<6; i++){
        printf("Give me a number: \n");
        scanf("%d",&a);
        
        if(i != 5){
            arr[i] = a;
        }
        else{
            n = a;
        }
    }


    b = boh(arr,n);


    for(i=0; i<5+n; i++){
        printf("%d\n",b[i]);
    }

    return 0;
}


int *boh(int *arr,int n){
    int *a;
    int i;
    int b;
    b = arr[4];
    a = (int*) realloc(arr,n*sizeof(int)+sizeof(arr));
    
    for(i=5; i<5+n; i++){
        b += b;
        arr[i] = b;
    }
    
    return arr;
}

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Можете ли вы сказать мне, где мне нужно поместить функцию free () для массива arr в этом коде?

Там no подходящее место для вашей основной программы на free() указатель arr, потому что функция boh() перераспределяет блок, на который она указывает. После этого указатель, за освобождение которого вы отвечаете, будет возвращен realloc(), а не исходным. Исходный указатель следует считать недействительным. На практике они могут иметь одно и то же значение, но часто это не так.

По этой причине ваша функция boh также не должна пытаться записать исходное значение arr после перераспределения, поскольку это происходит, когда он оценивает arr[i] = b.

Требуются следующие исправления:

  • проверьте возвращаемое значение каждого malloc() и realloc()calloc() ) вызов. Эти функции возвращают нулевой указатель в случае сбоя, и в этом случае вам необходимо учесть это каким-либо образом, например, полностью завершить программу.

  • После проверки возвращаемого значения realloc() не равно нулю, ваша функция boh должна использовать это значение вместо исходного значения arr. Достаточно простой способ сделать это - просто назначить его arr перед for l oop:

         arr = a;
    

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

  • В основной программе освободите b после того, как вы закончите его использовать (то есть , непосредственно перед return).

Я также пытаюсь проверить, свободна ли выделенная память.

C не предоставляет никакого способа проверить статус выделения указателя. Программист должен сам это отслеживать. Однако вы можете рассмотреть возможность запуска своей программы под управлением внешней программы проверки утечек, такой как Valgrind.

0 голосов
/ 07 августа 2020

Я думаю, в вашей программе есть несколько fl aws.

Вот версия без утечек памяти:

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

#define SIZE 6

int *boh(int *arr, int n) {
    int *a;
    int i;
    int b;
    b = arr[SIZE - 2];
    a = (int *) realloc(arr, (n + SIZE) * sizeof(int));
    for (i = SIZE - 1; i < (n + SIZE); i++) {
        b += b;
        a[i] = b;
    }
    return a;
}

int main() {
    int a, i, n;
    int *arr;
    int *b;

    arr = (int *) calloc(SIZE, sizeof(int));

    for (i = 0; i < SIZE; i++) {
        printf("Give me a number: \n");
        scanf("%d", &a);
        if (i != SIZE - 1) {
            arr[i] = a;
        } else {
            n = a;
        }
    }

    b = boh(arr, n);

    for (i = 0; i < (n + SIZE); i++) {
        printf("%d\n", b[i]);
    }

    free(b);

    return 0;
}

Вы должны поставить free на указатели, которые вы создали с помощью a malloc или аналогичные функции.

Проблема, которую я обнаружил, заключается в том, что вы использовали realloc без передачи фактического размера массива.

Использование sizeof(arr) не сработает, вы должны передать его как параметр функции.

...