使用void指针指向数组

时间:2012-01-11 00:42:52

标签: c pointers void-pointers pointer-arithmetic

我只是试图使用一个指向整数数组的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?

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,而不是增加指针的大小-反对。这不是标准化的,所以你不能依赖这种行为。