使用void指针指向数组

Anu*_*uri 5 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

133554432131072512
Run Code Online (Sandbox Code Playgroud)

为什么它没有固定数组的元素a []即1,2,3,4?

rua*_*akh 12

你需要arr 添加之前进行投射j.这是一个最小的修复:

x = *(((int *)arr)+j);
Run Code Online (Sandbox Code Playgroud)

但我认为写起来更清楚:

x = ((int *)arr)[j];
Run Code Online (Sandbox Code Playgroud)


oua*_*uah 5

您正在进行指针运算,void *但在C中无效.

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

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

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