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

Get values of void pointer to an array

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

=> 输出:{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);
}

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

???

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

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

在示例 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);
    

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