Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的类型转换问题#_C#_Pointers - Fatal编程技术网

C# C语言中的类型转换问题#

C# C语言中的类型转换问题#,c#,pointers,C#,Pointers,我正在尝试(最初来自)关于C#控制台项目上的堆和指针的一些东西。我的程序是这样的: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; public class Win32 { [DllImport("user32.dll", CharSet

我正在尝试(最初来自)关于C#控制台项目上的堆和指针的一些东西。我的程序是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

public class Win32
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr malloc(int size);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int free(IntPtr region); //Change IntPtr befroe free method to int ---update---
}

public class Program
{
    public unsafe void Heap()
    {
        int* num1, num2, answer;
        num1 = Win32.malloc(sizeof(int));
        *num1 = 999; // 999 should be the value stored at where pointer num1 refers to

        num2 = Win32.malloc(sizeof(int));
        *num2 = 1; // 1 should be the value stored at where pointer num2 refers to

        answer = Win32.malloc(sizeof(int));
        *answer = *num1 + *num2; // 1000 should be the value of pointer answer's reference

        Console.WriteLine(*answer); // 1000?
        Win32.free(num1);
        Win32.free(num2);
        Win32.free(answer);
    }
}
调试后,收到的错误消息显示:

错误1无法将类型“System.IntPtr”隐式转换为“int*”。一 存在显式转换(是否缺少强制转换?)

我这里的问题是为什么我不能在malloc和free之前使用IntPtr,因为这两种方法都返回void?我应该对代码进行哪些更改? 谢谢你的帮助

---更新---

更改:
公共静态外部IntPtr free(inthwnd)到公共静态
外部内部自由(IntPtr区域)
免费(*num)
免费(num)

给出额外的“CS1502”和“CS1503”两个错误

---第二次更新--- C#自动处理堆东西。C#中没有malloc的等价物。这是一条死胡同。有几个错误:

以信用证支付++

void * malloc(int sizeToAllocate);
int free(void * region);
malloc
返回的值传递到
free
。因此,您的进口应为:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr malloc(int size); 

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int free(IntPtr region); 
因此,您的释放代码应该是:

 var num1Ptr = Win32.malloc(sizeof(int));
 int * num1 = (int*) num1Ptr.ToPointer();

 ...

 var num2Ptr = Win32.malloc(sizeof(int));
 int * num2 = (int*) num2Ptr.ToPointer();

 ...

 var answerPtr = Win32.malloc(sizeof(int));
 int * answer = (int*) answerPtr.ToPointer();

 ...

 Win32.free(num1Ptr);
 Win32.free(num2Ptr);
 Win32.free(answerPtr);

你错过了一个演员吗?
@Rob问题是我认为我没有错过一个演员。我不知道如何将void转换为int。谢谢你的帖子。它帮助我更好地理解平台调用的工作方式,以及我关于free(指针)而不是free(值)的错误。但是,它会额外出现两个错误:“CS1502:Win32.free(System.IntPtr)”的最佳重载方法匹配项具有一些无效参数”和“CS1503:Argument1:无法从“int*”转换为“System.IntPtr”。您是对的,您可能只需执行一个简单的
Win32.free(IntPtr(num1))但更严格的方法是更新的解决方案。我发现了我的问题,在user32.dll或其他引用中找不到malloc,它在C#中没有任何等价物。愚蠢的我跑进了死胡同,不停地把头撞在墙上。T_T。
 var num1Ptr = Win32.malloc(sizeof(int));
 int * num1 = (int*) num1Ptr.ToPointer();

 ...

 var num2Ptr = Win32.malloc(sizeof(int));
 int * num2 = (int*) num2Ptr.ToPointer();

 ...

 var answerPtr = Win32.malloc(sizeof(int));
 int * answer = (int*) answerPtr.ToPointer();

 ...

 Win32.free(num1Ptr);
 Win32.free(num2Ptr);
 Win32.free(answerPtr);