使用void指针指向数组

我只是试图使用一个指向整数数组的void指针,我试着看看是否可以通过将数组转换回int来打印数组。 但它给了我一些随机价值。 你能告诉我哪里出错了吗?

#include #include int main(){ int a[5]; int x; int j; a[0]=1; a[1]=2; a[2]=3; a[3]=4; void *arr=a; for(j=0;j<4;j++){ x = *(int *)(arr+j); printf("%d",x); } return 0; } 

输出是这样的:

 133554432131072512 

为什么它不是针对数组的元素a []即1,2,3,4?

你需要添加j 之前 arr 。 这是一个最小的修复:

 x = *(((int *)arr)+j); 

但我认为写起来更清楚:

 x = ((int *)arr)[j]; 

你在void *上做指针运算,这在C中是无效的。

在GNU C(带有gcc扩展名的C)中,它实际上是允许的, sizeof (void)被认为是1。

http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html

“指向void和指向函数的指针支持加法和减法操作。这是通过将void或函数的大小视为1来完成的。”

你不应该向void指针添加数字。 之前投了它。 ( x = *((int *)arr+j);

当您向指针添加数字时,编译器会将此数字与指向的类型的大小相乘,因此如果向指向错误类型的指针添加数字,则会得到错误的结果。

如果我记得正确,添加到void *是非法的,但是一些编译器会添加确切的字节数(就像它是char *)。 `

C标准没有定义void *算术的行为,因此在对它进行算术运算之前,需要先将 void *为另一个指针类型。

有些编译器[作为扩展]将void *的指针算法与char *相同,因此每个’+1’只会将地址增加1,而不是指向对象的大小。 这不是标准化的,所以你不能依赖这种行为。