c-使用指向数组的void指针



我只是试图使用一个指向整数数组的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*一样)。`

相关内容

  • 没有找到相关文章

最新更新