2016-03-09 2 views
-3

Я не настолько знаком с C++, так что я хочу спросить, что следующий код будет делать (я его в существующий C++ проект):Указатель массива + Integer (C++)

1: char* buf; 
2: *buf = 0; 
3: int readBytes = tcpSocket->read(buf, 10); 
4: buf += readBytes; 

Объяснение очень просто, из TCP Socket следует читать 10 байт, а прочитанные байты хранятся в буфере «buf» char *. Возвращаемое значение - количество прочитанных байтов.

Но зачем мне нужна линия 4? Или лучше, что делает линия 4? В моем понимании это разрушает мой результат «buf», не так ли?

Я надеюсь, что кто-то может мне помочь, а может объяснить мне, почему мне нужна эта линия 4.

BR THW

+4

Неопределенное behavour здесь»' * ЬиЕ = 0; 'Ваш указатель не делает. указывают на любое место, которое может быть отменено. – juanchopanza

+0

'buf + = readBytes' перемещает указатель в конце прочитанных байтов. Вероятно, чтобы следующий вызов' tcpSocket-> read' начал писать после уже прочитанных байтов Но, как сказал juanchopanza, в коде, показанном как 'buf', никогда не было инициализировано в любом случае. И, конечно же, вам нужно будет сохранить указатель на начало orginial где-нибудь, если вы хотите использовать его позже. –

+1

Вам нужно указать' buf' на фактический буфера. Что-то вроде 'c данные har [10]; char * buf = data; '. – molbdnilo

ответ

0

Line 4 продвигает указатель на байты, которые Вы читаете, так что, например, при следующем вызове вы не перезаписываете свои предыдущие данные.

Как указано в комментариях, строка 2 является неопределенным поведением, поскольку вы не указали свой указатель buf на выделенную память.

+0

Вам нужно указать что-то лучше, чем «строка 2 не будет работать». Он может работать, он может потерпеть неудачу, он может вызвать ошибку сегментации, и в целом он может многое сделать. –

2

TCP - это протокол потоковой передачи, то есть нет никаких границ сообщений в данных, которые вы получаете. Поэтому невозможно получить все данные, запрашиваемые одним приёмным вызовом, но их нужно циклически и многократно читать.

Выполнение, например, buf += readBytes вы указали указатель buf на readBytes элементов, поэтому в следующий раз, когда вы получите данные, будет записано, где последний принимающий звонок слева.

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

Позволяет поставить все это вместе в хорошую функцию, которая всегда будет читать требуемый объем данных, в качестве примера:

// tcpSocket is the socket to receive data from (I don't know the actual type) 
// buffer is the destination buffer, where the received data should be written 
// len is the number of bytes to receive 
// Pre-condition: buffer must point to memory of at least len bytes 
bool read_data(TCPSocketType* tcpSocket, char* buffer, size_t len) 
{ 
    // Loop while there are still bytes to read 
    while (len > 0) 
    { 
     ssize_t readBytes = tcpSocket->read(buffer, len); 
     if (readBytes <= 0) 
     { 
      // There was an error (readBytes < 0) 
      // Or the connection was closed (readBytes == 0) 
      return false; 
     } 

     buffer += readBytes; // Next position to write data into 
     len -= readBytes; // We don't need to read as much now 
    } 

    return true; // Now we have read all of the data 
} 
+0

Спасибо за анзер, смещение указателя имеет смысл. Но если указатель один раз в конце, а затем функция возвращается, является ли указатель на вызывающую функцию тогда в начале? Или еще в конце? Потому что я ничего не нашел для перемещения указателя на начало снова. – ThW

+0

@ThW Указатель передается по значению, что означает, что функция получает копию. Изменение копии не будет изменять оригинал, поэтому указатель, который вы используете при вызове функции, не будет изменен и будет по-прежнему указывать на начало буфера. –

+0

Отлично, спасибо за все быстрые ответы. Это решает мою проблему! СПАСИБО ВАМ ВСЕМ! – ThW

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