7

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

4 回答 4

15

您需要arr 添加j. 这是一个最小的修复:

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

但我认为写起来更清楚:

x = ((int *)arr)[j];
于 2012-01-11T00:45:27.567 回答
6

您正在执行void *在 C 中无效的指针算术。

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

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

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

于 2012-01-11T00:50:21.087 回答
2

C 标准没有定义 的算术行为void *,因此您需要先将您void *指针类型转换为另一种指针类型,然后再对其进行算术运算。

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

于 2012-01-11T00:50:45.847 回答
1

您不应该将数字添加到 void 指针。之前投。( x = *((int *)arr+j);)

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

如果我没记错的话,添加到 void* 是非法的,但是一些编译器会添加以字节为单位的确切数字(就像它是 char*)。`

于 2012-01-11T00:50:02.350 回答