none
BYTE array 指標 RRS feed

解答

  • C# 使用指標的方法和 C++ 相同,但是必須要宣告 unsafe,才可以使用指標,否則是不能使用 .
    2007年5月13日 上午 10:55
    版主
  • 基本上沒有byte [] *這種東西

    你必須了解byte* pointer是指向某一個記憶體區塊的指標,當他+1時,指標會跳往下1 byte, -1則回頭1byte

    byte[]是一段連續的記憶體區塊,你要存取他仍然用byte* 去運算,看是指向到哪一個記憶體位址

    另外 一個觀念可以參考一下,假設你用byte[]宣告了1000 bytes,然後用int*指向byte[]的起頭位址,每當int* +1時他會跳4 bytes,這代表了pointer不受指向的資料型別所限制,資料都是存放在記憶體內,你可以用任何型別pointer去指,再加以運算,不過,系統是沒有byte[]*這種pointer的,因為Array是同樣資料型別的集合資料,要存取他用的Pointer還是原始的型別,否則byte[]* +1或是-1不知道會跳到哪裡去

     

    FYI

    2007年5月14日 上午 01:49

所有回覆

  • C# 使用指標的方法和 C++ 相同,但是必須要宣告 unsafe,才可以使用指標,否則是不能使用 .
    2007年5月13日 上午 10:55
    版主
  • 謝謝.  我知道. 我可以取出 int*, char*, byte* 的位址, 但是 byte[]* 取不出來, 請問要如何做呢?
    2007年5月13日 下午 03:42
  • 基本上沒有byte [] *這種東西

    你必須了解byte* pointer是指向某一個記憶體區塊的指標,當他+1時,指標會跳往下1 byte, -1則回頭1byte

    byte[]是一段連續的記憶體區塊,你要存取他仍然用byte* 去運算,看是指向到哪一個記憶體位址

    另外 一個觀念可以參考一下,假設你用byte[]宣告了1000 bytes,然後用int*指向byte[]的起頭位址,每當int* +1時他會跳4 bytes,這代表了pointer不受指向的資料型別所限制,資料都是存放在記憶體內,你可以用任何型別pointer去指,再加以運算,不過,系統是沒有byte[]*這種pointer的,因為Array是同樣資料型別的集合資料,要存取他用的Pointer還是原始的型別,否則byte[]* +1或是-1不知道會跳到哪裡去

     

    FYI

    2007年5月14日 上午 01:49
  • 感謝. 原來如此.

    現在我測試在同一個程序內, 用 byte* 跟 一個長度值 去跑迴圈可以抓出原指標的位址與內容值了.

     

    但還是有些盲點可否再給予指導, 就是我原本是想讓兩支完全獨立的程式, 可以在共享同一塊記憶體區塊裡的資料,

    例如AP1有一個 byte[] bytData 固定都是用來放要共用的資料, 另外有一個 byte* ptrData 是指向 bytData[] 的第1個元素, 然後我把

    ptrData 跟 bytData.Length 轉成字串丟給了 AP2, 在AP2再把這個資訊轉成一個位址指標, 並且依照原本 bytData.Length 的長度,

    把AP1 中的 bytData 的元素值一個個抓出來.

    但是我發現在AP2中轉換出來的這個位址好像錯了, 因為抓出來的資料都不是原本在 AP1 的 bytData 中的.

    但是我在 AP2 debug 時可以看到轉換出來的位址的確跟 AP1 的 ptrData 相同.

    不知道我這樣描述是否清楚?

     

    2007年5月14日 下午 01:24
  • AP跟AP之間的記憶體位置是完全獨立開的,各自有各自的定址,每一個32位元的程式,都會虛擬配置4G的空間使用,雖然系統沒有實際插那樣多的記憶體,作業系統還是會去幫你轉換實際的位址. 所以你要做兩支AP間的記憶體共享,就要試試其他的方式了,不過作起來都有點複雜,你可以到MSDN 找找SDK有關IPC的文章參考看看

     

    2007年5月15日 上午 07:20
  • 了解, 原來觀念錯誤了.

    謝囉!

    2007年5月16日 上午 12:20
  • 如果只是要讓兩個AP共享記憶體的話,其實不用使用指標也可以做得到,

    利用System.Runtime.InteropServices.Marshal就可以做到。

    2007年5月16日 上午 01:55