何か、だんだん深みに嵌ってきた感じがするけど、C#の構造体でメンバに構造体へのポインタを含むものについて実験してみた。 unsafe修飾子を使った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace StructTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public unsafe struct topT { public int x; public childT* y; } public struct childT { public double a; public char b; } private void button1_Click(object sender, EventArgs e) { topT tt; childT ct; unsafe { tt.y = &ct; } label2.Text = Marshal.SizeOf(typeof(childT)).ToString(); label4.Text = Marshal.SizeOf(typeof(topT)).ToString(); label6.Text = Marshal.SizeOf(typeof(int)).ToString(); label8.Text = Marshal.SizeOf(typeof(double)).ToString(); label10.Text = Marshal.SizeOf(typeof(char)).ToString(); label12.Text = Marshal.SizeOf(typeof(childT*)).ToString(); } } } |
childTの変数を定義して、topTのポインタにアドレスを渡してやらないと、ttからchildTのメンバにアクセスできない。 後から考えたら当たり前だけど、だいぶ悩んだ。
ついでにサイズを表示してみたけど、C同様パディングが実行されているようで、ttのサイズはchildT*のサイズとintのサイズの和になっていない。
構造体のメンバにポインタがある場合は、topTのサイズのアンマネージドメモリを確保して、APIに渡してもダメだということなんだろうな..。