Как напечатать 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]--;
}
}