【问题标题】:Array type casting in CC中的数组类型转换
【发布时间】:2021-07-18 22:29:44
【问题描述】:

我有一个如下给出的程序,我正在学习 C 中的类型转换。这里我试图将 void* 转换为 int*。但是编译器抛出一个错误说“error: operand of type 'void' where arithmetic or pointer type is required - printf("%d\n",(int *)(a[2]));

感谢您帮助进行这种类型转换。

#include <stdio.h>

void printArray(void* a){
        printf("%d\n",(int *)(a[2]));

}

int main(){
        int a[] = {1,2,3,4};
        printArray(a);
        return 0;
}

【问题讨论】:

  • (int *)(a[2])) ==> ((int*)a)[2] 。您的代码尝试获取不可索引序列的第二个槽值,然后将其转换为 int*。您想将指针转换为int*,然后获取(假定的)int 序列中的第二个槽值。
  • 您必须在取消引用之前进行转换。否则编译器不知道类型的大小,无法计算偏移量。

标签: c implicit-conversion void-pointers pointer-arithmetic


【解决方案1】:

在带有下标运算符的表达式中

a[2]

这里用到了指针算法。这个表达式的计算类似于

*( a + 2 )

反过来,这个表达式a + 2实际上被评估为

( char * )a + 2 * sizeof( *a )

但是void 类型是不完整的类型,即它的大小是未知的。所以编译器不知道表达式sizeof( *a ) 的值是什么,其中*a 的类型为void。因此,它会发出一条错误消息。

你需要写的是首先将void *类型的指针a转换为int *类型

所以printf 的调用看起来像

printf("%d\n", ( ( int * )a )[2] );

printf("%d\n", *( (int *)a + 2) );

【讨论】:

    【解决方案2】:

    a[2] 等价于 *(a + 2)。 avoid *,所以你取消引用 void * 这是非法的。

    您应该将a 转换为int *,然后取消引用它,如下所示:

    *((int *)a + 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      相关资源
      最近更新 更多