|
■No51667 (sato さん) に返信
> このときTestの中身を0x31で初期化したい
No51648 に書いたと思いますが、そういう時は構造体側にコンストラクタを用意しましょう。
struct _test {
public int aaa;
public int bbb;
public int ccc;
public _test(int i) { aaa = bbb = ccc = i; }
}
こうしておけば、
_test Test = new _test(0x31);
のようにして初期化できます。
構造体側に手を加えたくないのであれば、呼び出し側で
Test.aaa = Test.bbb = Test.ccc = 0x31;
のようにするのが手軽でしょう。
どうしてもメモリコピーを行いたいのであれば、0x31 データに対する固定ポインタを得た上で、
それを System.Runtime.InteropServices.Marshal クラスの PtrToStructure メソッドで
マーシャリングするという事も一応はできますが、止めておいた方が良いでしょう。
// アンセーフコードによる実装例
_test Test;
unsafe { fixed (int* p = new int[] {0x31, 0x31, 0x31}) {
Test = (_test)Marshal.PtrToStructure((IntPtr)p, typeof(_test));
}}
// Pinned ハンドルによる実装例
_test Test;
GCHandle h = GCHandle.Alloc(new int[] {0x31, 0x31, 0x31}, GCHandleType.Pinned);
Test = (_test)Marshal.PtrToStructure(h.AddrOfPinnedObject(), typeof(_test));
h.Free();
|