【问题标题】:Get values of void pointer to an array获取指向数组的 void 指针的值
【发布时间】:2016-11-10 11:14:29
【问题描述】:
// 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* 更好?

【问题讨论】:

    标签: pointers void-pointers vala


    【解决方案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);
      

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

    【讨论】:

    • 无法将void* 的值获取到数组中?
    • 您可以将void* 转换为int[] 就好了。我将编辑我的答案以显示这一点。
    • Jens 关于不在 Vala 中使用指针是绝对正确的。如果你在 Vala 中使用指针而不是与需要它们的绑定交互(如 libxml),那么你做错了。
    猜你喜欢
    • 2012-03-25
    • 2011-10-20
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2019-08-24
    相关资源
    最近更新 更多