// 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*
更好吗?
答案 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*
):
取第一个元素的地址:
int[] ary = {111, 222, 333};
func(&ary[0]);
将数组转换为指针:
int[] ary = {111, 222, 333};
func((void*) ary);
PS:void*
在其他上下文中可能有不同的含义(如不透明的结构指针或ref / out参数或其他丑陋的低级构造)。