我只是试图使用一个指向整数数组的void指针,我试着看看是否可以通过将数组转换回int来打印数组。但它给了我一些随机价值。你能告诉我哪里出错了吗?
#include<stdio.h>
#include<stdlib.h>
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?
答案 0 :(得分:12)
您需要在添加arr
之前投射j
。这是一个最小的修复:
x = *(((int *)arr)+j);
但我认为写起来更清楚:
x = ((int *)arr)[j];
答案 1 :(得分:5)
您正在void *
上进行指针运算,这在C中无效。
在GNU C(带有gcc扩展名的C)中,它实际上是允许的,sizeof (void)
被认为是1.
http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html
“指向void的指针支持加法和减法运算 以及指向函数的指针。这是通过处理a的大小来完成的 无效或函数为1.“
答案 2 :(得分:1)
你不应该向void指针添加数字。之前投了它。 (x = *((int *)arr+j);
)
当您向指针添加数字时,编译器会将此数字与指向的类型的大小相乘,因此如果向指向错误类型的指针添加数字,则会得到错误的结果。
如果我记得正确,添加到void *是非法的,但是一些编译器会添加确切的字节数(比如char *)。 `
答案 3 :(得分:1)
C标准没有定义void *
算术的行为,因此在对其进行算术运算之前,需要先将void *
转换为另一个指针类型 。
某些编译器[作为扩展]将void *
的指针算法视为与char *
相同,因此每个'+1'只会将地址增加1,而不是增加指针的大小-反对。这不是标准化的,所以你不能依赖这种行为。