Pointers 获取指向数组的void指针的值
=>输出:{155115112,155115112,3} 如何在vala中获取指向数组的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
※使用
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);