Функция всегда выделяет один и тот же адрес, а переменная не меняется

Функция f распределяет результат всегда по одному и тому же адресу, что делает main() функция всегда выводит один и тот же результат, как сделать так, чтобы функция выделяла переменную другой адрес и free их.

int *f(int a) {
    int b = 2 * a;
    return &b;
}

int main(void) {
    int *p4, *p8;

    p4 = f(4);
    p8 = f(8);

    printf("p4: %i / p8: %i\n", *p4, *p8);
}

2 ответа

Функция f ничего не выделяет, возвращает адрес локальной переменной с автоматическим хранением. Доступ к данным через этот указатель вызывает неопределенное поведение, как только b выходит за рамки, когда f возвращается. Компилятор должен быть в состоянии обнаружить такую ​​глупую ошибку.

Чтобы выделить память, вы должны использовать malloc:

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

int *f(int a) {
    int *p = malloc(sizeof(*p));
    if (p != NULL)
        *p = 2 * a;
    return p;
}

int main(void) {
    int *p4 = f(4);
    int *p8 = f(8);

    if (p4 != NULL && p8 != NULL) {
        printf("p4: %i / p8: %i\n", *p4, *p8);
    }
    free(p4);
    free(p8);
    return 0;
}

Вы должны еще лучше объявить b как статический или объявить b как параметр в функции f. Вы могли бы сделать что-то вроде этого

static bool f(int a,int *b)
{
    if(NULL == b)
    {
        return false;
    }
    *b = a * 2;
    return true;
}

Лучше написать функции, которые ничего не возвращают (void) или логическое значение, чтобы вы знали, все ли прошло хорошо, и использовать указатели для изменения данных и уменьшения использования стека. Большинство критических по безопасности стандартов принимают это правило.

Другие вопросы по тегам