Pointers 获取指向数组的void指针的值

Pointers 获取指向数组的void指针的值,pointers,void-pointers,vala,Pointers,Void Pointers,Vala,=>输出:{155115112,155115112,3} 如何在vala中获取指向数组的void指针的值 ※使用void[]比使用void*?在示例C代码中,void*大致相当于一个字节数组(一些内存块),因此您可以这样做: // Vala public void func (void *ptr) { int *iptr = ptr; print("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]); } void main(string

=>输出:{155115112,155115112,3}

如何在vala中获取指向数组的void指针的值


※使用
void[]
比使用
void*

在示例C代码中,void*大致相当于一个字节数组(一些内存块),因此您可以这样做:

// Vala

public void func (void *ptr) {
    int *iptr = ptr;
    print("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]);
}

void main(string[] args) {
    int[] ary = {111, 222, 333};
    func(&ary);
}
然而,这是完全不安全的类型。此外,Vala对长度使用了一个附加的隐藏参数,该参数不是以字节为单位设置的长度,而是以元素为单位设置的长度(但通常
sizeof(int)!=sizeof(char)

我建议你找到一种不同的方法来解决你最初的问题

这个问题听起来很典型

在Vala中(事实上在所有现代高级语言中),使用裸指针是非常不受鼓励的。您应该使用容器、引用、智能指针等概念

编辑:好,下面是原始代码不起作用的原因以及解决方法:

您正在此处获取已经是指针的某个对象的地址:

public void func (uint8[] ptr) {
    int[] iptr = (int[]) ptr;
    print("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]);
}

void main(string[] args) {
    int[] ary = {111, 222, 333};
    func ((uint8[]) ary);
}
这只显示了
void*
有多危险。有两种方法可以解决此问题(同时仍使用
void*
):

  • 取第一个元素的地址:

    int[] ary = {111, 222, 333};
    // ary is already a pointer, &ary will give you an int**
    func(&ary);
    
  • 将数组强制转换为指针:

    int[] ary = {111, 222, 333};
    func(&ary[0]);
    

  • PS:
    void*
    在其他上下文中可能有不同的含义(如不透明的结构指针或ref/out参数或其他丑陋的低级构造)。

    无法将
    void*
    的值转换为数组?您可以将
    void*
    转换为
    int[]
    很好。我将编辑我的答案来说明这一点。Jens关于在Vala中不使用指针的观点是绝对正确的。如果您在Vala中使用指针进行其他操作,而不是与需要它们的绑定(如libxml)交互,那么您就错了。
    int[] ary = {111, 222, 333};
    func(&ary[0]);
    
    int[] ary = {111, 222, 333};
    func((void*) ary);