2015-03-13 89 views
-5
#include <iostream> 

using namespace std; 

int *GetSquare(int x) 
{ 
    int y = x; 

    y = y * y; 
    return &y; 
} 

int main() 
{ 
    const int n = 4; 
    int *p[n]; 

    for (int j = 0; j < 2; ++j) 
    { 
     p[2 * j + 1] = new int[2]; 

     for (int i = 0; i < 2; ++i) 
      p[2 * j + 1][i] = 2 * j + 1; 
    } 
    p[0] = GetSquare(2); 
    p[2] = GetSquare(4); 

    for (int j = 0; j < n; ++j) 
    { 
     for (int i = 0; i < 1; ++i) 
      cout << p[j][i] << " "; 
     cout << endl; 
    } 
    return 0; 
} 

當我幹這個代碼時,我得到輸出「4 1 16 3」。 而在編譯器中,我得到「16 1 3 3」 theres沒有辦法在哪裏我可以找到第一個輸出是16.我的代碼有什麼問題?沒有得到所需的輸出

+7

有一兩件事我注意到:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris 2015-03-13 19:08:34

+5

請將您的標題改爲與您遇到的問題更相關的內容。 「沒有得到正確的輸出」幾乎適用於任何有史以來的軟件錯誤。 – Borgleader 2015-03-13 19:08:51

+2

一個問題是你的'GetSquare'返回一個指向'GetSquare'本地的變量的指針。那很糟。你爲什麼不回傳價值?你是什​​麼意思,*當我幹這個代碼... *?它實際上應該做什麼? – lurker 2015-03-13 19:10:29

回答

2

此:

int *GetSquare(int x) 
{ 
    int y = x; 
    y = y * y; 
    return &y; 
} 

非常糟糕的事情

您正在返回堆棧中的值的地址,一旦離開函數就會失效。 一旦你離開了這個功能,你就不能依賴那個地址的生活。

你寫:

p[0] = GetSquare(2); 

,你可能會認爲p[0]是指向與價值4的整數除了指針是僅在GetSquare有效。

這個問題似乎被設計得很糟糕。爲什麼不從GetSquare返回實際的整數值,而不是指向無效內存地址的指針?

int GetSquare(int x) { return x * x; } 

編輯: 這個問題可以簡化爲這樣:

int* GetSquare(int x) 
{ 
    int y = x; 
    y = y * y; 
    return &y; 
} 

int main() 
{ 
    int* p = GetSquare(2); 
    int* q = GetSquare(4); 
    cout << "p == q? " << (p == q ? "YES" : "NO") << endl; 
    cout << p << " " << q << " " << endl; 
    return 0; 
} 

運行在調試模式,在釋放來看,隨着各種級別的調試信息和/或優化...你可能有時會得到4 16,但可能不會。它有時也可能會說pq是相同的,有時不是。

克里斯的評論中的鏈接有一個體面的解釋。

+0

'main'中的一些代碼隨後需要重構,因爲OP正在依靠'GetSquare'返回指向該值的指針。 – lurker 2015-03-13 19:14:00

+0

@lurker非常真實......留給讀者閱讀。 ;)但是,嚴肅地說,原來的問題是......非常奇怪......幾乎就像它寫在壞人身上的那些壞的東西一樣。乍一看,我不相信'GetSquare'是那裏唯一*不好的指針。 'GetSquare'是一個明顯的問題,但也許不是唯一的問題。 – 2015-03-13 19:18:34

+0

全部都是如此。 :)我只是想,如果有人指出一個解決方案,指出明顯的連鎖效應是有幫助的,但我同意:爲讀者鍛鍊。問題和代碼中有許多妖精。 – lurker 2015-03-13 19:22:04

0

您的ptogram具有未定義的行爲,因爲您正在返回指向該函數的局部對象的指針,該對象將在退出後被銷燬。

int *GetSquare(int x) 
{ 
    int y = x; 

    y = y * y; 
    return &y; 
} 

此外,返回指針而不是臨時對象是沒有意義的。該功能可以寫成像

long long int GetSquare(int x) 
{ 
    return (long long int)x * x; 
}