【问题标题】:C# unsafe type -> char*[] , getting a pointer on char arrayC# 不安全类型 -> char*[] ,获取 char 数组上的指针
【发布时间】:2012-12-29 22:32:21
【问题描述】:

有:

[DllImport("OpenAL32.dll")]
static extern void alcOpenDevice(char*[] devicename);

想把名字发送给这个函数:

char[] data = "Hello!".ToCharArray();
char*[] txt = &data;

但得到错误:

  • 无法将类型 char[] * 隐式转换为 char * []

    (有趣的错误,因为 C# 编译器也拒绝在 /unsafe 模式下定义 char[] * :))

  • 无法获取托管类型的地址、大小或声明指向托管类型的指针 (char[])

PS
char 何时成为托管的?它是一个结构,不是吗?

public struct Char : IComparable, IConvertible, IComparable<char>, IEquatable<char>

尽管编译器显示了有关声明指向托管类型的指针的信息 (char[])。我只能建议,当类型是数组时,CLR 可能会将其呈现为托管类型,但这听起来很疯狂。

【问题讨论】:

    标签: c# arrays pointers pinvoke unsafe


    【解决方案1】:

    alcOpenDevice 不采用char*[]char**,它采用char*,您应该将其指定为string。它还返回一个句柄。

        [DllImport("OpenAL32.dll", CharSet = CharSet.Ansi)]
        static extern IntPtr alcOpenDevice(string devicename);
    

    【讨论】:

    • 啊,我一时糊涂了。 “字符* []”?这还有效吗?
    • char* 对 C/C++ 有效; C# 中的 char* 是不同的东西,它不是 C# 中指向 char-array 的指针,而是指向单个 char 的指针(C/C++ 和 C# char* 定义的主要区别)
    • @Icarus3 是的,因为编译器接受它。它是char* 的数组。使用它将许多 char* 传递给函数,通过自动将托管数组编组到 char**
    • @OlegOrlov 这不是真的。它可以是指向许多字符的指针。 int* 可以是指向许多 int 的指针。就像 C/C++ 一样。你可以使用fixed(int* intPointer = intArray)
    • C# char 与 C 或 C++ char 不同(不要介意指针或数组)。
    猜你喜欢
    • 2021-01-26
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2018-09-26
    相关资源
    最近更新 更多