获取指向数组

时间:2016-11-10 11:14:30

标签: pointers void-pointers vala

// C lang

#include <stdio.h>

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

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

=&GT;输出:{111,222,333}

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

=&GT;输出:{155115112,155115112,3}

???

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

※使用void[]比使用void*更好吗?

1 个答案:

答案 0 :(得分:1)

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

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

但这完全是不安全的类型。此外,Vala对长度使用附加隐藏参数,该参数未设置为以字节为单位的长度,而是使用元素中的长度(但通常​​为sizeof(int) != sizeof(char))。

我会建议找到一种不同的方式来解决你原来的问题。

这个问题听起来像一个典型的XY problem

在Vala中(实际上在每种现代高级语言中)都非常不鼓励使用裸指针。您应该使用容器,引用,智能指针等概念。

修改:好的,这就是为什么您的原始代码不起作用以及如何修复它的原因:

您正在使用已经是指针的地址:

int[] ary = {111, 222, 333};
// ary is already a pointer, &ary will give you an int**
func(&ary);

这只表明void*有多危险。有两种方法可以解决这个问题(同时仍然使用void*):

  1. 取第一个元素的地址:

    int[] ary = {111, 222, 333};
    func(&ary[0]);
    
  2. 将数组转换为指针:

    int[] ary = {111, 222, 333};
    func((void*) ary);
    
  3. PS:void*在其他上下文中可能有不同的含义(如不透明的结构指针或ref / out参数或其他丑陋的低级构造)。