【问题标题】:How to print the void * in a function and how to access the void * variable in a function?如何在函数中打印 void * 以及如何访问函数中的 void * 变量?
【发布时间】:2015-06-17 11:44:16
【问题描述】:

我正在尝试使用 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] );

我该如何解决这个问题?

【问题讨论】:

  • 您不能使用void* 指针来访问数组,因为它不知道每个元素的大小。
  • void main()--> int main()
  • 由于 print 函数只有在传递指向 int 的指针时才能工作,所以我不知道您为什么要通过与 void* 之间的转换来使生活变得困难。

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


【解决方案1】:

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

但似乎您实际上并不想打印实际的指针,而是 它指向的内容,这就是您的错误的来源,因为您的转换位置错误,您需要在取消引用之前转换指针,例如

((int *) Arg)[0]

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

【讨论】:

    【解决方案2】:

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

    要完成此操作,您需要将cast Arg 本身转换为int *,然后使用解引用运算符获取值。

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

    【讨论】:

      【解决方案3】:

      这样试试吧

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

      【讨论】:

        【解决方案4】:

        代码的问题在于 printf 中使用的下标运算符,例如 Arg[0]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]--;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-13
          • 2021-01-12
          相关资源
          最近更新 更多