C# c语言结构中的指针#

C# c语言结构中的指针#,c#,.net,wpf,C#,.net,Wpf,我使用的结构名为avl_node,代码如下: unsafe struct avl_node { Studentdb data; avl_node *left; avl_node *right; int height; }; 我想在名为avl_methods的类中创建一个函数Height。。请参阅下面的代码: class avl_methods { public unsafe int height(avl_n

我使用的结构名为avl_node,代码如下:

unsafe struct avl_node
    {
        Studentdb data;
        avl_node *left;
        avl_node *right;
        int height;
    };
我想在名为avl_methods的类中创建一个函数Height。。请参阅下面的代码:

class avl_methods
{
    public unsafe int height(avl_node *a_node)
    {
        if(a_node==NULL)
        {
            return -1;
        }
        else
        {
            return a_node->height;
        }
    }
}
我现在遇到的错误是无法获取托管类型的地址、大小或声明指向托管类型的指针。尽管我允许在项目中使用不安全代码。请帮帮我。我真的很想在结构中使用指针,因为这是我的项目的要求。我正在开发一个桌面应用程序使用WPF4.0


希望得到更好的回应

问题一定与Studentdb结构有关。我认为从声明avl_节点的位置看不到它

此代码段引发了您得到的错误

    unsafe struct avl_node
    {
        Studentdb data;
        avl_node* left;
        avl_node* right;
        int height;
    };

    //unsafe struct Studentdb
    //{
    //    int height;
    //};
这没关系

    unsafe struct avl_node
    {
        Studentdb data;
        avl_node* left;
        avl_node* right;
        int height;
    };

    unsafe struct Studentdb
    {
        int height;
    };
您发布的代码中指针的声明没有问题

更新

这是struct Studentdb的OP定义,用户第一次发布时我没有这个定义

struct Studentdb
{
 int student_id;
 String Student_name;
 Date dob;
 char gender;
 String department;
};
您还可以将结构更改为以下内容:

    struct Studentdb
    {
        int student_id;
        char * []Student_name;
        char*[] dob;
        char gender;
        char*[] department;
    };
因为字符串是clr类型,不能与指针一起使用。

您正在使用

Studentdb
{
 int student_id;
 String Student_name;
 Date dob; char gender;
 String department;
};
字符串是.NET中的引用类型,对于结构指针来说是
不可blittable

显然,
Studentdb
中的
String
ans
char
导致了这个问题。要了解原因,您需要了解垃圾收集器是如何工作的。它通过跟踪对对象的引用来发现垃圾

因此,编译器可以预先告知垃圾收集器将永远无法看到字符串引用

唯一的解决方法是严格限制自己的值类型。对字符串执行此操作的唯一方法是在
非托管内存中分配它们


请参阅:

问题可能是
Studentdb
?您能解释一下为什么需要这样做吗?很少需要c#中的指针/不安全代码,除非您正在做一些p/invoke工作(或性能关键代码),正如CharleH指出的,您想做什么?如果你刚刚得到高度,你不需要指针。如果你从C++到C(我已经完成了),它需要一些时间来远离指针和“信任”C。在您的示例中,您根本不需要指针。@ling.s struct Studentdb{int student_id;String student_name;Date dob;char gender;String department;};在C#中实现这种数据结构的两种标准方法是:1)对节点使用引用类型,并使用引用而不是指针来引用子节点。C++引用比C++引用更接近C++指针。他们只是不支持算术,但你不需要。2) 使用结构,将其放入数组,并在数组中使用索引而不是指针。avl_节点中的数据成员“data”具有数据类型“Studentdb”,这也是一种结构。。。我不会因此而出错。。。。该错误是由于avl\U nodeleft、avl\U noderight。。。。。。由于Studentdb,绝对没有错误…Studentdb结构的定义是从哪里得到的?我没有因此得到错误,错误是由指针引起的。。。如果我注释掉结构avl_节点,那么程序编译得非常完美!!!这是问题的唯一原因,请在没有Studentdb数据的情况下尝试;