多谢zhoutler(笑熬浆糊) ! 请问我用 char* mychar = new char[2048]; BITMAPINFO mybitmap = new BITMAPINFO;//BITMAPINFO是VC中定义的一个存储BITBMP信息的一个结构。 mybitmap = (BITMAPINFO*)mychar ; 请问上面的语句我用C#怎么实现?还有你说的unsafe代码内存回收能否讲的详细一点,推荐篇文章也好!谢谢!
直接使用 BITMAPINFO mybitmap = new BITMAPINFO() 就可以。
没有那么简单,实际上是让mybitmap和mychar指向相同的地址,类型不同很难办。
1.定义BITMAPINFO类型 [StructLayout(LayoutKind.Sequential)] public class BITMAPINFOHEADER { [FieldOffset(0)] public Int32 biSize; [FieldOffset(4)] public Int32 biWidth; [FieldOffset(8)] public Int32 biHeight; [FieldOffset(12)] public Int16 biPlanes; [FieldOffset(14)] public Int16 biBitCount; [FieldOffset(16)] public Int32 biCompression; [FieldOffset(20)] public Int32 biSizeImage; [FieldOffset(24)] public Int32 biXPelsPerMeter; [FieldOffset(28)] public Int32 biYPelsPerMeter; [FieldOffset(32)] public Int32 biClrUsed; [FieldOffset(36)] public Int32 biClrImportant; }[StructLayout(LayoutKind.Sequential)] public class BITMAPINFO { public BITMAPINFOHEADER bmiHeader; public IntPtr bmiColors; } 2. int size = Marshal.SizeOf(typeof(BITMAPINFO)); 3.IntPtr ptrBitMap = Marshal.AllocCoTaskMem(size ); 4.BITMAPINFO mybitmap = (BITMAPINFO Marshal.PtrToStructure(ptrBitMap, typeof(BITMAPINFO));看看行不行
在C#中,数组是引用类型哦!意味着数组本身就是在heap上分配的。这个与struct不同,它是值类型,在stack上分配.
C#中有基本数据类型byte,表示无符号的8位整数呢.
对于你需要显式的进行内存分配:
1.堆栈分配 stackalloc();函数
不能显式释放该函数申请的空间,而且该空间不受垃圾回收器管理.函数返回结束,自动释放空间
2.动态内存分配 HeapAlloc //当然从kernel32导入的dll函数
完全需要程序员对内存空间负责.
以上代码应该都是 unsafe代码.而且C#规定指针只能指向诸如int,short,long ,double,enum等非托管类型,任何指向引用类型都是错误的.与引用类型不同,指针不受垃圾回收器跟踪的哦.程序员要负责到底.
请问我用
char* mychar = new char[2048];
BITMAPINFO mybitmap = new BITMAPINFO;//BITMAPINFO是VC中定义的一个存储BITBMP信息的一个结构。
mybitmap = (BITMAPINFO*)mychar ;
请问上面的语句我用C#怎么实现?还有你说的unsafe代码内存回收能否讲的详细一点,推荐篇文章也好!谢谢!
[StructLayout(LayoutKind.Sequential)]
public class BITMAPINFOHEADER
{
[FieldOffset(0)]
public Int32 biSize;
[FieldOffset(4)]
public Int32 biWidth;
[FieldOffset(8)]
public Int32 biHeight;
[FieldOffset(12)]
public Int16 biPlanes;
[FieldOffset(14)]
public Int16 biBitCount;
[FieldOffset(16)]
public Int32 biCompression;
[FieldOffset(20)]
public Int32 biSizeImage;
[FieldOffset(24)]
public Int32 biXPelsPerMeter;
[FieldOffset(28)]
public Int32 biYPelsPerMeter;
[FieldOffset(32)]
public Int32 biClrUsed;
[FieldOffset(36)]
public Int32 biClrImportant;
}[StructLayout(LayoutKind.Sequential)]
public class BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public IntPtr bmiColors;
}
2.
int size = Marshal.SizeOf(typeof(BITMAPINFO));
3.IntPtr ptrBitMap = Marshal.AllocCoTaskMem(size );
4.BITMAPINFO mybitmap = (BITMAPINFO Marshal.PtrToStructure(ptrBitMap, typeof(BITMAPINFO));看看行不行
请问是什么原因引起的呢?结构中这句public IntPtr bmiColors;用指针代结构可以么?
请问是什么原因引起的呢?结构中这句public IntPtr bmiColors;用指针代结构可以么?