2015-09-02 5 views
0

Если я сделал функцию, которая суммирует две переменные и возвращает результат суммирования по указателю.Указатели как возвращаемое значение

Каковы ожидаемые проблемы от этого алгоритма?

+2

Неопределенное поведение, поскольку вы возвращаете адрес локальной переменной. – Downvoter

+1

Вы просто спрашиваете об «алгоритме», или у вас есть какой-то конкретный код, который вызывает проблемы? Потому что, если у вас есть код, вы должны показать его нам, чтобы мы могли помочь вам решить проблему, с которой вы столкнулись. –

+1

Показать код, поэтому нам не нужно угадывать, в чем проблема. –

ответ

1

Нет проблем, если вы делаете это так:

void sum(int a, int b, int *res) 
{ 
    *res = a+b; 
} 

и, например, вызов, как:

int x; 
sum(5, 6, &x); 

Но ниже не правильно:

int* sum(int a, int b) 
{ 
    int *res; 
    int x = a+b; 
    res = &x; 
    return res;// returning address of x - but x is not alive when function ends; don't do it 
} 

PS. вы также можете использовать malloc, сохранить результат (a+b) в этой памяти (назначив a+b на *res), а затем верните этот указатель, но затем вызывающему нужно будет его освободить.

1

Если результат находится в стеке (то есть объявлен локально в вашей функции), тогда указатель будет указывать на переменную, которая будет перезаписана после выполнения дополнительных вызовов функций.

Возможно, он работает в некоторых случаях (т. Е. Сразу же возвращается из функции и захватывает значение до того, как будут перенесены дополнительные кадры стека), но, в общем, это ошибка/ошибочная ошибка.

2

ожидаемые проблемы

  • неинициализированные указатель (s)

    void add(int a, int b, int * pc) 
    { 
        *pc = a + b; 
    } 
    
    int main(void) 
    { 
        int a = 1; 
        int b = 2; 
        int * pc; 
    
        add(a, b, pc); 
    
        ... 
    

    Выпуск: pc точки "нигде".

  • плохо выровнена память

    void add(int a, int b, int * pc) 
    { 
        *pc = a + b; 
    } 
    
    int main(void) 
    { 
        int a = 1; 
        int b = 2; 
        char c[sizeof (int)]; 
    
        add(a, b, c); /* or even add(a, b (int*) c); */ 
    
        ... 
    

    Проблема: Хотя достаточно большая память для c не может быть правильно выровнены провести int.

  • недействителен памяти

    void add(int a, int b, int * pc) 
    { 
        int c = a + b; 
        pc = &c; 
    } 
    
    int main(void) 
    { 
        int a = 1; 
        int b = 2; 
        int * pc; 
    
        add(a, b, pc); 
    
        ... 
    

    Проблема: При возвращении из add()pc пунктов недействительных памяти, как уже освобождаться, а именно c, который жил в стеке add() «s.

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