2012-12-04 46 views
1
int a = 10;  
int *p = &a; 

*p = 20; /* Is this a valid statement? */ 

我明白,如果我做int *p;,然後如果我做*p = 10,它是無效的,因爲我還沒有分配任何內存p。但是,我想知道如果初始化指向某個地址的指針分配內存到該指針或不?我是否需要將內存分配給已初始化的指針?

+0

您已將內存分配給'p'。 –

+0

內存是'a',現在它的值是'20'。 –

+0

請考慮重寫最後一句,並將* it *替換爲它應該引用的內容。目前,「某地址」和「指針」之間存在混淆。這就是爲什麼你得到「是」和「否」的答案。 – dasblinkenlight

回答

5
int a = 10;  
int *p = &a; 

*p = 20; /* Is this a valid statement? */ 

答案就在這種特殊情況下YES

但是,當你這樣做:

int *ptr; //declaration of pointer variable 
*ptr = 20; // It means you are assigning value 20 to the variable where `ptr` points to. 

但實際上ptr不指向任何地方,基本上就意味着它有indeterminate value

這樣做*ptr = 20會將值20放到由ptr指向的內存地址。 所以在你區分它是有效的,因爲&a是有效的內存位置和p開始指向該變量的時候我們做p= &a這就是所謂的Undefined bahavior

因此*p = 20意味着實際上使用指針p更改或分配值a

2

不,它不分配內存。您的p實際上指向與&a相同的位置,並在*p = 20;中修改相同的內存。這不會因爲您引用分配的內存而崩潰(對於a)。如果這是你真正想要的只取決於你。

6

我想知道初始化指向某個地址的指針是否會分配內存嗎?

它不分配任何內存。由於p一個指向一個已分配的內存

int a = 10; // a is statically allocated and value 10 is assigned. 
int *p = &a; // p is pointed to address of a. 
*p = 20; // at this point p points to that statically allocated memory 
+1

好吧,所以我只是修改標記爲'a'的內存位置。 – user1624400

+0

@ user1624400對。它的內存相同。我用更多細節更新了答案 –

0

不,沒有必要的。因爲你的指針指向a變量的地址。所以,當你使用*p = 20時,a的值將會改變。

所以,你的問題的答案是YES。 :)

1

但是,我想知道是否初始化指向某個地址的指針分配內存或不是?

你是什麼意思「分配內存給它」?當你創建一個指針時,你正在分配(靜態)它的內存,換句話說,它需要內存來保持現有的內存。

除此之外,還有指針指向的內存。當您說int a = 10時,您正在創建一個int並分配足夠大的內存空間來容納它。
然後說出p = &a表示:「我的指針必須指向存儲地址a」。顯然你已經分配了a,所以你可以安全地使用*p,但通常情況下這是不正確的,你可能有一個未初始化的指針指向某個非法地址。

4
int a = 10;  
int *p = &a; 

我在想,如果初始化一個指向某個地址分配內存給指針或不是?

號的ap變量需要棧上分配,或者如果他們的功能之外,他們會被分配的內存爲全局變量。編譯器將自動爲您完成此,即使你只是有...

int a;  
int* p; 

...沒有= <expression>指定其初始值。發生的情況基本上是,在內存中的某個地址處,將保留大量字節(可能是4或8),以將您標識的值存儲爲a,並且在另一個地址處將存儲更多內存(可能爲4或8字節)保留存儲您調用p的值。

p&a簡單地拷貝a數字地址到內存p初始化......它不會引起任何[1],也將他們的內存分配。

它可以幫助視覺像這樣,用一些虛構的地址...

MEMORY-ADDRESS   CONTENTS   NAME 
1000      10     a 
2000      1000    p 

這裏,p「點」到a因爲p的存儲保持a的地址的內容。但編譯器會選擇ap的地址,而不管其值是否有任何初始化或其他更改。

我想在這裏混淆你的是,使用指針當我們經常分配內存......是這樣的:

p = new int; 

這樣做是找到一個動態的int運行一些內存,加載地址的內存轉換爲p,所以我們可以開始將它稱爲p並使用它來存儲int值。當我們完成它時,我們可以delete p將內存返回給系統,以便在完成另一個new時可以回收和使用它。這種類型的分配需要在代碼中明確執行(或者在您調用的某個庫函數的代碼中)。

[1] - 優化器可能會選擇不爲a和/或p分配實際的內存 - 使用CPU寄存器代替,但不會影響程序的功能行爲(可能會影響性能)。

3

A 指針只是一個號碼。它有一個特殊的類型來確保它可以代表正確的數字範圍,並有助於程序的理解,但基本上它只是一個數字。

number代表內存地址。你不能只做這些:你需要從某個地方得到一個有意義的地址。

您可以:

  • 採取退出的變量的地址:p = &a;或
  • 從「堆」分配一些內存:p = malloc(size)

就是這樣,一旦你有一些內存的地址,你就大功告成了!您現在可以使用解除引用指針在您喜歡的任何位置使用*運算符:*p = somedata

+0

說一個指針只是一個數字是不準確的。在許多實現中,指針只是一個數字。但是,指針也可能有其他形式。例如,它可能是一對數字或地址和存儲在該地址的一些附加信息的組合。 –

+0

@EricPostpischil:非常真實,我自己實現了FDPIC系統,但我們不要不必要地使事情複雜化。即使在這些情況下,擴展指針可以被看作是一個「數字」,儘管解釋更復雜。 FDPIC改變了函數指針的形式,但沒有修改數據指針。 – ams

相關問題