2015-06-17 3 views
1

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

Как исправить проблема?

+1

Вы не можете использовать указатель 'void *' для доступа к массиву, так как он неизвестен, какой размер каждого элемента. –

+1

'void main()' -> 'int main()' –

+0

Так как функция 'print' будет работать только при передаче указателя на' int', я не знаю, почему вы затрудняете жизнь, бросая в 'void *'. –

ответ

3

Для печати указателя необходим формат "%p"printf.

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

((int *) Arg)[0] 

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

1

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

Для этого необходимо установить castArg на номер int *, а затем использовать оператор разыменования для получения значения.

Кроме того, чтобы напечатать указатель, вам нужно использовать спецификатор формата %p.

1

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

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

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