2012-03-03 73 views

回答

4

不同的是,第一個不編譯:

lol.cpp:2:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int' 
    int *p1 = 10; 
     ^ ~~ 
1 error generated. 

而第二個使得與值10堆一個int,並分配一個指向堆棧上該值。

如果第一個沒有編制,說如果你增加了一個演員,它會是值10分配給指針p1,這意味着p1將指向內存地址10 = 0x0A*p1會嘗試將該地址解除引用爲int,這將是段錯誤。 (如果你使用了一個不同的數字,碰巧在你的進程的內存空間中,它會是一些任意的整數,這取決於內存中的內容)

+0

那是鏗鏘嗎?我祝賀你的優秀編譯器選擇:) +1,因爲它也是正確的。 – delnan 2012-03-03 21:32:42

0

表達式int* p1 = 10不應該編譯:它初始化一個指針用整數!

0

p1p2是指向整數變量的指針。

p1的初始化是錯誤的。作爲一個指針,它應該包含一個整型變量的地址。並且您將「地址」賦值爲「10」:您將其設置爲指向地址0x0000000A,這幾乎肯定是無效的。

1

並根據您的問題的另一部分。不,他們不是都分配在堆上。實際上它們都被分配在堆棧上。只有第二個指向由new運算符在堆上分配的區域。如果它們是分配給new的對象的一部分,它們將被分配到堆上。