Free () не работает даже после того, как я использовал malloc для выделения памяти || C программирование - PullRequest
1 голос
/ 18 июня 2019

Free () не освобождает память при компиляции. Ранее я выделил с помощью malloc, и я проверил его, чтобы убедиться, что указатель не является нулевым.

Это ошибки, которые я получаю при компиляции своего кода:

malloc: * ошибка для объекта 0x7ffee53e1aa4: освобожденный указатель не выделен malloc: * установить точку останова в malloc_error_break для отладки

void math(int array[], int length, int* sum, int* mult);

int main(void)
{
    int sum = 0;
    int mult = 1 ;
    int a[] = {1, 33, 12, 2, 9, 2};

    int* sump = (int*) malloc(1*sizeof(int));

    if(sump == NULL){
        printf("sump is null");
    }

    int* multp = (int*) malloc(1*sizeof(int));

    if(multp == NULL){
        printf("multp is null");
    }

    sump = ∑
    multp = &mult;

    math(a, 6, sump, multp);

   if(sump != NULL){
       free(sump);
   }
if(multp != NULL){
       free(multp);
   }

    printf("sum: %d mult: %d\n", sum, mult);


    return 0;
}

void math(int array[], int length, int* sump, int* multp)
{
    int i;
    int sum = 1; 
    int mult = 1;

    for(i=0; i<length;++i){
        sum += array[i];
        mult *= array[i];

    }

    printf("%d %d\n", sum, mult);


    *multp = mult;
    *sump = sum;


}

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

вам не нужно создавать указатели, так как вы можете просто передать адрес sum и mult в math ().

следующий код делает то, что вы после я думаю:

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

void math(int array[], int length, int* sum, int* mult);

int main(void)
{
    int sum = 0;
    int mult = 1;
    int a[] = { 1, 33, 12, 2, 9, 2 };

    math(a, 6, &sum, &mult);

    printf("sum: %d mult: %d\n", sum, mult);

    return 0;
}

void math(int array[], int length, int* sump, int* multp)
{
    int i;
    int sum = 0;
    int mult = 1;

    for (i = 0; i < length; ++i) {
        sum += array[i];
        mult *= array[i];

    }

    printf("%d %d\n", sum, mult);

    *multp = mult;
    *sump = sum;
}
0 голосов
/ 18 июня 2019
int* sump = (int*) malloc(1*sizeof(int));

sump теперь указывает на анонимный объект, созданный malloc.

sump = &sum;

Теперь sump указывает на объект sum, который вы определили ранее. Выделенный объект потерян.

if(sump != NULL){
    free(sump);
}

Проверка NULL не нужна, поскольку free(NULL) является законным и ничего не делает. Но поскольку sump больше не указывает на выделенный объект, free(sump) имеет неопределенное поведение. (Вам повезло, что ваша система во время выполнения смогла диагностировать это для вас.)

Сообщение об ошибке было сгенерировано во время выполнения, а не во время компиляции.

И вам не хватает обязательных директив #include в верхней части кода:

#include <stdio.h>
#include <stdlib.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...