1

我正在使用一个名为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;
        }
    }
}

现在我得到的错误是无法获取托管类型的地址、大小或声明指向托管类型的指针。虽然我在我的项目中允许了不安全的代码。请帮我。我真的很想在结构中使用指针,因为这是我项目的要求。我正在使用 WPF 4.0 开发桌面应用程序...

希望得到更好的回应!

4

2 回答 2

2

您正在使用

Studentdb
{
 int student_id;
 String Student_name;
 Date dob; char gender;
 String department;
};

字符串是 .NET 中的引用类型,non-blittable用于结构指针。

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

所以编译器可以预先告诉垃圾收集器将永远无法看到字符串引用。

解决此问题的唯一方法是将自己严格限制为值类型。对字符串执行此操作的唯一方法是将它们分配到unmanaged memory

参考:http: //msdn.microsoft.com/en-us/library/75dwhxf7.aspx

于 2013-05-02T10:14:18.610 回答
0

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

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

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

由于 string 是不能与指针一起使用的 clr 类型。

于 2013-05-02T10:06:36.937 回答