2013-04-10 30 views
9

我的理解,根據MSDN C#固定的語句應該像:不安全字符串的指針聲明

fixed (char* p = str) ... // equivalent to p = &str[0] 

這樣,爲什麼我不能老是這樣做呢?

const string str = "1234"; 
    fixed (char* c = &str[0]) 
    { 
/// ..... 
    } 

如何獲取指向str[1]的指針?

+0

你會得到什麼錯誤? – 2013-04-10 07:02:40

+0

編譯時錯誤: 無法獲取給定表達式的地址 – 2013-04-10 07:04:23

+0

可能的重複[無法獲取給定表達式的地址\t C#指針](http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-given-expressionc-pointer) – 2013-04-10 07:28:07

回答

4

這是因爲字符串上的[]運算符是一個返回值的方法。當它是一個原始值類型時從方法返回值沒有地址。

[]操作者在C#是不一樣的,如C. []在C中,數組和字符串只是指針,並在指針施加[]操作,等效於移動指針和解除引用它。這不適用於C#。

其實有你鏈接的MSDN文檔中的錯誤,即固定在latest version.

對這個確切的事情更多解釋見here

+0

「方法的返回值沒有地址。」不完全正確 - 只是發生了'string [int]'返回的是'char',它不是可以「固定」的類型。 – 2013-04-10 07:17:34

1

fixed語句的目的是防止內存分配在虛擬內存之間移動。內存分配由其開始標識,而不是由任何其他地址標識。

所以要保持&str[1]固定,你真的需要整個str固定;您可以使用指針算術來根據您的需要從固定指針到str的單個分配中派生其他指針。

0

你的代碼改成這樣:

char[] strC = "1234".ToArray(); 
fixed (char* c = &strC[0]) 
{ 
    /// ..... 
} 
+0

這給出了一個地址,該地址指向保存第一個字符的內存位置,但不能用於訪問字符串的其他字符。 – 2013-04-10 07:14:01

7

由於獲得一個指向後面元素直接與陣列工作,但不是用繩子好像唯一的原因是,MS沒有實現它。按照數組的語義,很容易就可以像這樣設計它。

但是,您可以輕鬆地計算指向其他數組元素的另一個指針。所以在實踐中這不是一個大問題:

fixed (char* p = str) 
{ 
    char* p1 = p+1; 
}