Как напечатать void * в функции и как получить доступ к переменной void * в функции?

Я пытаюсь передать функцию в качестве аргумента другой функции с 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 ответа

Решение

Чтобы напечатать указатель, вам нужно "%p"printf формат.

Но кажется, что вы на самом деле не хотите печатать реальный указатель, а только то, на что он указывает, и вот откуда ваша ошибка, потому что ваше приведение находится не в том месте, вам нужно привести указатель, прежде чем разыменовать его, как например

((int *) Arg)[0]

Это проблема с приоритетом оператора, когда оператор индекса массива имеет более высокий приоритет, чем оператор приведения типа. Таким образом, компилятор думает, что вы делаете (int *) (Arg[0]),

Оператор индекса массива (разыменование) может использоваться с полным типом. void * не полный тип, который вы можете разыменовать.

Чтобы сделать это, вам нужно cast Arg сам к int * а затем используйте оператор разыменования, чтобы получить значение.

Также для распечатки указателя нужно использовать %p спецификатор формата.

Попробуйте это, может быть, это

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

Проблема с кодом заключается в том, что оператор print, используемый в 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]--;
    }
}
Другие вопросы по тегам