2016-02-29 3 views
-2

Функция 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); 
} 
+0

http://stackoverflow.com/questions/12380758/c-error-function-returns-address-of-local-variable –

ответ

4

Функция 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; 
} 
+0

Для OP требуется «и« бесплатно ». часть. – chux

+1

@chux: действительно хорошая практика «освобождать» всю выделенную память, хотя и не обязательно, когда программа выходит. – chqrlie

+0

OP - [знакомый] (http://stackoverflow.com/q/35691275/2410359) с принятием. Подумайте, [Все в порядке. Однажды.] (Http://meta.stackoverflow.com/a/251298/2410359) – chux

0

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

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

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

+0

Ни одна из этих опций не касается вопроса OP: * как заставить функцию распределить переменную с другим адресом и освободить их. * – chqrlie

+0

Согласен обнаружение успеха или отказ в распределении - это хорошо. Тем не менее мой опыт работы с «критическими по безопасности стандартами» полностью запретил распределение памяти. – chux

+0

Поскольку ему нужна только переменная, нет оснований использовать malloc() и, следовательно, free(), поэтому я разместил возможное (простое) решение его проблемы, которое не требует использования упомянутых выше функций. From MISRA/C : «Правило 20.4 (обязательно): динамическое распределение памяти кучи не должно использоваться». –

Смежные вопросы