2010-07-03 80 views
12

C#中不安全代碼的侷限性是什麼?例如,我可以像使用C或C++一樣進行幾乎任意的指針轉換和算術運算嗎?C中的不安全代碼#

回答

11

是的。當不安全時,All bets are off

這是「不安全」背後的想法 - 即可驗證類型的「安全性」已被移除,並且您可以從一種類型的指針轉​​換爲另一種類型的指針,而無需運行時將運行時從shooting yourself in the foot中刪除所以願望 - 很像C或C++。

下面是在C#中使用不同的指針類型的例子:

fixed (Byte* dstBytes = &currentImage[0]) 
{ 
    var dstBuffer = (Int64*)dstBytes; 
    const int blockCount = ImageSizeInBytes/sizeof(Int64); 

    for (var j = 0; j < blockCount; j++) 
    { 
     dstBuffer[j] = srcBuffer[j]; 
    } 
} 

注意陣列的類型爲Byte[],但我得到一個Byte*後,我可以將它轉換爲Int64*,並在8個字節工作時間。

+0

+1對於鏈接,(和一個很好的答案)。 – Sam 2013-06-04 14:00:02

1

是的,你可以在任何你喜歡的地方製作一個指針點。

但是,由於程序在虛擬地址空間中運行,因此只能訪問該空間中實際存在的內存,即無法訪問任何其他進程,並且無法訪問未訪問的內存「已被分配。

0

您可以瞭解更多信息請參考以下頁面:

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

不安全的代碼提供了對幾乎所有的原始變量聲明指針(基本類型)的能力;您可以在指針類型之間進行投射。指針運算基於指針類型的存儲大小,因此對指針應用後增量或後減量將通過sizeof(type)增加地址。

3

是的,這都是可能的。這裏是MSDN的Unsafe Code Tutorial

對於所有這些說如何使用這是一個可怕的想法:是的,但它是有原因的。我不得不使用這個(第一次),通過第三方API獲取網絡攝像頭數據,返回Byte *