我只是试图使用一个指向整数数组的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?
在添加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的指针支持加法和减法运算以及指向函数的指针。这是通过处理无效或具有1的功能。"
C标准没有定义void *
的算术行为,因此在使用它进行算术之前,您需要先将void *
强制转换为另一个指针类型
一些编译器[作为扩展]将void *
的指针算术处理为与char *
相同,因此每个‘1;只会将地址增加1,而不是增加指向对象的大小。但这并不是标准化的,所以你不能依赖这种行为。
您不应该向无效指针添加数字。先投吧。(x = *((int *)arr+j);
)
当你向指针添加数字时,编译器会将这个数字与所指向类型的大小相乘,所以如果你向指向错误类型的指针添加数字,你会得到错误的结果。
如果我记得正确的话,添加到void*是非法的,但有些编译器会添加以字节为单位的确切数字(就像char*一样)。`