2013-06-05 4 views
4

У меня есть funciton, который возвращает указатель на пустоту. Допустим, я знаю, что блок данных, на которые указывает, представляет собой массив ints. Как я могу напечатать их?Печать значений указателя void

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

printf("%i",*((int*)data)); 

Но, как я сказал, что данные представляют собой массив целых чисел. Я пытался это сделать, но это не является допустимым выражением:

for(i = 0; i<3; i++){ 
    printf("%i \n", *((int*)(data+sizeof(int)*i))); 
} 

Что такое правильный способ печати это?

+2

'int * ptr = void_pointer;', а затем просто используйте 'ptr'. (Вы также можете написать '* ((int *) data + i)', но наличие 'int *' для использования менее подвержено ошибкам.) –

+0

Кстати, '* ((int *) data + i) 'отлично и правильно (хотя и не совсем читаемо). –

+0

@ H2CO3 Более читаемый, чем '* (int *) ((char *) data + i * sizeof (int))', не так ли? ;) –

ответ

5

Просто используйте временный int*:

int *p = data; 
for (int i=0; i<3; i++) 
    printf("%i\n", p[i]); 

Обратите внимание, что нет явного приведения в первой строке, потому что не нужно с void* и избегая явных приведений считается хорошим стилем C. Внутри цикла я использовал тот факт, что вы можете индексировать указатель на массив, как если бы это был массив.

1

Ваша первоначальная попытка неверна в «формальном» C, поскольку арифметика указателя не применима к указателям void *. Однако некоторые компиляторы поддерживают арифметику указателя на указателях void * как нестандартное расширение (GCC является заметным примером). В таких компиляторах void * указатели рассматриваются как char * указатели для арифметических целей. И ваш

for(i = 0; i < 3; i++) 
    printf("%i\n", *((int *) (data + sizeof(int) * i))); 

будет работать в таком компиляторе.

С более педантичным компилятором, вы можете сохранить в день, делая

for(i = 0; i < 3; i++) 
    printf("%i\n", *((int *) ((char *) data + sizeof(int) * i))); 

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

Что вам действительно нужно, это просто

for(i = 0; i < 3; i++) 
    printf("%i\n", ((int *) data)[i]); 

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

Смежные вопросы