2014-09-13 69 views
-7

請參見下面的代碼片段:將指針指向變量地址並明確指向內存地址有什麼區別?

#include<iostream> 
using namespace std; 

int main() 
{ 
    int a=10; 
    int *p=&a; 
    *(p+1)=6; 
    cout<<*(p+1); 
} 

上面的代碼不起作用。但是,下面的代碼段,其中分配給一個明確的內存地址,沒有工作:

#include<iostream> 
using namespace std; 

int main() 
{ 

    int *p=(int *)0x28fefc; 
    *(p+1)=6; 
    cout<<*(p+1); 

} 

爲什麼這些方法中的一個工作,而不是其他? 我在第二個地址中使用了我的電腦的內存地址。該地址可能無法在其他某臺機器上使用。

+0

你是什麼意思的「不工作」?怎麼了? – 2014-09-13 18:50:32

+0

過程返回負值並立即終止 – user3553836 2014-09-13 18:58:11

回答

4

這些都是未定義的行爲。您正試圖修改您未分配的內存。第二個更不安全,因爲你認爲每次都會將a分配到該地址,這絕對不是一個安全的假設。

+0

@ user35538​​36未定義的行爲意味着一切都有可能,但沒有任何保證。因爲你的電腦「工作」並不意味着它可以在別的地方工作。 – 101010 2014-09-13 18:53:22

+0

它不是「工作」,它是未定義的行爲。這意味着該標準沒有具體說明應該發生什麼。編譯器可能會讓你這樣做,它可能會拋出異常,它可能會使你的電腦崩潰,或者它可能無能爲力。 – CoryKramer 2014-09-13 18:53:28

+0

thanx我懂了!這意味着使用任何內存我必須先借助變量聲明等來分配它? – user3553836 2014-09-13 19:13:23