2013-11-22 1 views
0

Я новичок в C progrmming и я посмотрел на следующий код:скобки в определении программирования C указатель

struct iphdr *iph = (struct iphdr *)Buffer; 

Что означает выражение значит?

здесь ссылка на код http://www.binarytides.com/packet-sniffer-code-c-linux/

+3

Это называется литым ... любой учебник или ссылки на C будет охватывать его. Я настоятельно рекомендую, чтобы люди действительно читали книги о языках программирования, а не пытались запутаться. –

ответ

2

Он бросает buffer указатель на struct iphdr, а затем инициализирует iph к этому указателю. Это используется потому, что buffer является указателем на буфер необработанных байтов, но в этой функции известно, что байты, хранящиеся в буфере, соответствуют формату struct iphdr. Следовательно, struct iphdr может использоваться для доступа к содержимому буфера, а не для интерпретации и обработки необработанных байтов.

Редактировать: Чтобы уточнить (согласно комментариям): Приведение не копирует и не конвертирует ничего. В основном это говорит компилятор «Я знаю, что buffer должен содержать unsigned char с, но в это конкретное время эти байты на самом деле являются struct iphdr, поэтому позвольте мне получить доступ к ним через указатель iph более удобным способом».

+0

(Я использую строчное имя 'buffer' в соответствии с исходным кодом, связанным с вопросом.) – Arkku

+0

Вот как я понимаю, что происходит, скажите, пожалуйста, если я ошибаюсь. «buffer» - это массив неподписанных символов, и если первый член 'iphdr' представляет собой, например, массив из трех символов без знака, то он скопирует первые 3 символа буфера, и то же самое произойдет для других членов' iphdr'. спасибо – maximilliano

0

buffer является указателем на массив unsigned char, который используется для хранения необработанных пакетных данных.

Это переопределение типа buffer в качестве указателя на struct iphdr, поэтому вы можете присвоить его iph и прочитать его как структуру. Технически это просто подавляет ошибку компилятора, которая говорит, что значение buffer не может быть присвоено iph, потому что они имеют разные типы, несмотря на то, что они оба являются указателями.

В качестве альтернативы, вы можете сделать buffer типа void*.

Указатель на void может быть назначен на любой другой тип указателя без необходимости переделать его тип:

void* buffer = malloc(65536); 
... 
void ProcessPacket(void* buffer, int size) { 
    struct iphdr *iph = buffer; 
    ... 
} 

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

  • Нет связанных вопросов^_^