2013-10-21 109 views
0

我的函數有未定義的行爲?由於有局部變量c,所以它在自動定位,所以它會在執行函數後被破壞? (範圍端)是我的代碼未定義行爲

int* calculate(int* a,int* b) 
{ 
    int c=(*a)+(*b); //local variable c 
    return &c; 
} 
int main() 
{ 
    int a=12; 
    int b=23; 
    int* ptr=calculate(&a,&b); 
    std::cout<<*ptr<<endl; 
} 
+1

是的,它是UB。你正在返回一個局部變量的地址。 – juanchopanza

+0

好的,非常感謝你;) –

+0

好的謝謝沒有使用c變量,只是返回(* a)+(* b);那也將是未定義的行爲?因爲沒有局部變量。 –

回答

2

是,指針返回到一個臨時本地對象和解除引用即未定義的行爲

因爲退出函數calculate後,該對象超出範圍並自動被銷燬,則提供的指針指向一個無效地址,並且它是一個懸掛指針。之後,您可以使用解除引用並使用它(例如:*ptr)。

在你的情況,你可以使用普通的變量,消除那些*

int calculate(int *a, int *b) 
{ 
    int c = (*a)+(*b); 
    return c; 
} 

,因爲你沒有什麼合理的指針,通過他們,這是更好地去除更多*

int calculate(int a, int b) 
{ 
    int c = a + b; 
    return c; 
} 
+0

好的,謝謝沒有使用c變量,只是返回(* a)+(* b);那也將是未定義的行爲?因爲沒有局部變量。 –

+0

@DonCarleone:'(* a)+(* b)'不是一個指針,你不能返回它,它會導致編譯錯誤。我已經更新了我的答案,再看一遍。 – deepmax

+0

**指向一個無效的地址,它是一個懸掛指針**錯誤!沒有任何懸掛的指針!每個人都說懸掛指針,但它不像懸掛在這裏那樣的東西。這個c會被銷燬,所以它意味着它不存在,這意味着如果它在一個內存中的地址,它不會在那裏有更多的內存空間,所以我們怎麼稱呼這個未知的地址,我們通常會說NULL。所以在Main ptr指針值將是NOADDRESS它將是NULL。 –

1

您可以通過在main中聲明的intcalculate,如下所示::

void calculate(int* a,int* b, int* c) 
{ 
    *c=(*a)+(*b); 
    return ; 
} 
int main() 
{ 
    int a=12; 
    int b=23; 
    int c=0; 
    calculate(&a,&b,&c); 
    std::cout<<c<<endl; 
    return 0; 
} 

的更簡單的方法是::

int Calculate(int a, int b) 
{ 
    return a+b ; 
} 
int main(void) 
{ 
    int a=12, b=23; 
    std::cout<<Calculate(a,b)<<endl; 
    return 0; 
} 
相關問題