如何在函数中打印void *以及如何在函数中访问void *变量?

时间:2015-06-17 11:44:16

标签: c linux pointers compiler-errors void-pointers

我正在尝试使用void指针将函数作为参数传递给另一个函数,但它不起作用

#include "header.h"
void print ( void *Arg )
{
//  while ( ( int *) Arg[0] )
    {
        printf ( "Arg[0] = %d Arg[1] = %d\n",(int *)  Arg[0], (int * ) Arg[1] );
        sleep ( 1 );
        //Arg[0]--;
        //Arg[1]--;
    }
}
void main(int argc, char **argv)
{
    int count[2] = { 10, 160};
    print (count);
}

我遇到这样的错误:

void*.c: In function ‘print’:
void*.c:6:52: warning: dereferencing ‘void *’ pointer [enabled by default]
   printf ( "Arg[0] = %d Arg[1] = %d\n",(int *)  Arg[0], (int * ) Arg[1] );
                                                    ^
void*.c:6:3: error: invalid use of void expression
   printf ( "Arg[0] = %d Arg[1] = %d\n",(int *)  Arg[0], (int * ) Arg[1] );
   ^
void*.c:6:69: warning: dereferencing ‘void *’ pointer [enabled by default]
   printf ( "Arg[0] = %d Arg[1] = %d\n",(int *)  Arg[0], (int * ) Arg[1] );
                                                                     ^
void*.c:6:3: error: invalid use of void expression
   printf ( "Arg[0] = %d Arg[1] = %d\n",(int *)  Arg[0], (int * ) Arg[1] );

如何解决问题?

4 个答案:

答案 0 :(得分:3)

要打印指针,您需要"%p" printf格式。

但似乎你实际上并不想打印实际的指针,而是指向,这就是你的错误来自哪里,因为你的演员是在错误的地方,你需要在取消引用它之前强制转换指针,例如

((int *) Arg)[0]

operator precedence存在问题,其中数组下标运算符的优先级高于类型转换运算符。所以编译器认为你正在做(int *) (Arg[0])

答案 1 :(得分:1)

数组下标运算符(取消引用)可以与完整类型一起使用。 void *不是您可以取消引用的完整类型。

要完成此操作,您需要castArg本身设为int *,然后使用取消引用运算符获取值。

此外,要打印指针,您需要使用%p格式说明符。

答案 2 :(得分:1)

尝试这样可能

printf ( "Arg[0] = %d Arg[1] = %d\n",((int *)Arg)[0], ((int * )Arg)[1] );

答案 3 :(得分:0)

代码的问题在于printf中使用的下标运算符(例如Arg[1]void *)应用于int *类型的指针。

您首先要将此指针强制转换为void print ( void *Arg ) { // while ( ( int *) Arg[0] ) { printf ( "Arg[0] = %d Arg[1] = %d\n", ( (int *) Arg )[0], ( (int * ) Arg )[1] ); sleep ( 1 ); //Arg[0]--; //Arg[1]--; } } 类型,然后才应用下标运算符

void print ( void *Arg )
{
    int *p = Arg;
//  while ( ( int *) Arg[0] )
    {
        printf ( "Arg[0] = %d Arg[1] = %d\n", p[0], p[1] );
        sleep ( 1 );
        //Arg[0]--;
        //Arg[1]--;
    }
}

如果在函数的开头定义一个本地指针,代码会更简单。例如

androidx.test:runner:1.1.1