Функция всегда выделяет один и тот же адрес, а переменная не меняется
Функция 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) или логическое значение, чтобы вы знали, все ли прошло хорошо, и использовать указатели для изменения данных и уменьшения использования стека. Большинство критических по безопасности стандартов принимают это правило.