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