gpt4 book ai didi

c# - C#中的类型转换问题

转载 作者:行者123 更新时间:2023-11-30 21:52:09 25 4
gpt4 key购买 nike

我正在尝试(最初来自 here)关于 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);
}
}

调试后,得到的错误信息是:

Error 1 Cannot implicitly convert type 'System.IntPtr' to 'int*'. An explicit conversion exists (are you missing a cast?)

error CS1502: The best overloaded method match for 'Win32.free(System.IntPtr)' has some invalid arguments

error CS1503: Argument 1: cannot convert from 'int*' to 'System.IntPtr'

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

---更新---

更改:public static extern IntPtr free(int hWnd); 到 public static extern int free(IntPtr region); , free(*num)free(num)

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

---第二次更新---C# 自动处理堆的事情。 C# 中没有等效的 malloc。这是一个死胡同。 T_T

最佳答案

一些错误:

在 C/C++ 中

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);

关于c# - C#中的类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35031883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com