2013-08-30 21 views
-18
#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 

int * add(int *, int *); 
int add(int, int); 

void main() { 
    int a, b, sum, *z; 
    cout << "enter the value of a & b"; 
    cin >> a >> b; 
    z = add(&a, &b); 
    sum = add(a, b); 
    cout << "\nthe sum is: " << sum << endl; 
    cout << "the sum is :" << *z << endl; getch(); 
} 

//.....calling with value..... 
int add(int a, int b) { 
    int s; 
    s = a + b; 
    return s; 
} 

//......calling with address....... 
int *add(int *a, int*b) { 
    int r; 
    r = *a + *b; 
    return &r; 
} 

後爲什麼會給出錯誤的答案:爲什麼叫指針給出錯誤的值

輸出........ A = 70 B = 80值的總和:150有地址之和爲:1208

...但是當我給該程序爲:

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 

int * add(int *, int *); 
int add(int, int); 

void main() { 
    int a, b, sum, *z; 
    cout << "enter the value of a & b"; 
    cin >> a >> b; 
    sum = add(a, b); 
    cout << "\nthe sum is: " << sum << endl; 
    z = add(&a, &b); 
    cout << "the sum is :" << *z << endl; 
    getch(); 
} 

//.....calling with value..... 
int add(int a, int b) { 
    int s; 
    s = a + b; 
    return s; 
} 

//......calling with address.......  
int *add(int *a, int*b) { 
    int r; 
    r = *a + *b; 
    return &r; 
} 

它提供了正確的答案。

輸出..... a = 70 b = 80與值的總和爲:150與地址的總和爲:150。

爲什麼?

+1

也請提供一下兩個程序之間的區別,這將有助於我們更好地理解您的問題。 – cmaster

+0

如果我們將r聲明爲全局變量,那麼它將在兩種情況下都起作用。是的,請給出兩個程序之間的區別 – Freedom911

+0

可能的[C++代碼需要說明]的副本(http://stackoverflow.com/questions/18409639/c-code -needs-解釋) –

回答

5
int *add(int *a,int *b) 
{ 
    int r;  // r resides on stack 
    r=*a+*b; 
    return &r; 

} // life time of r ends here. 

您正在返回導致未定義行爲的局部變量的地址。編譯器應該已經警告過它。

3

當你返回的r的地址時,你有一個變量的地址位於堆棧的當前「空閒」區域。使用的內存已經釋放後,無論是「陳舊堆」或「過時堆」是「不確定的行爲」

在這種情況下,任何使用r在未來棧中的位置將覆蓋值r與其他「隨機」值。在這種情況下,它看起來可能是功能add的地址(參數爲int)。

我還建議您使用更現代化的編譯器(一個年齡不足以在大多數國家合法申請駕駛執照)並啓用警告。例如GCC(這是免費軟件,所以沒有成本) - 它會發出「返回本地變量地址」的警告。

相關問題