массив символов по сравнению с символьным указателем

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

(И да, мне не нравится шаблонный шаблон метода;))

6
задан fresskoma 23 January 2011 в 21:59
поделиться

4 ответа

Вызов malloc (4) действительно выделяет только четыре байта. Просто совпадение, что следующий байт в памяти оказался NUL, который завершил вашу строку для вас.

В случае, когда вы разместили буфер символов [4] на в стеке следующим байтом оказался 'x' , за которым следовало что-то другое, поэтому ваша строка просто продолжалась до тех пор, пока не был найден следующий байт NUL.

Функции сокета работают только с байтами, и не Не обрабатывайте байты как строки с завершающим NUL или чем-то еще. Вы получаете именно то, о чем просите.

16
ответ дан 8 December 2019 в 03:54
поделиться

Для правильного завершения NULL необходимо 5 символов. Завершающий NULL считается за единицу, поэтому, если нам нужно N символов, выделите N + 1. Или, наоборот, для выделения N у вас есть доступный N-1 для вашего контента.

6
ответ дан 8 December 2019 в 03:54
поделиться

Я подозреваю, что разница - совпадение. Когда вы используете буфер как строку, например, в printf (), он будет считываться за его предел, пока не будет найден '\ 0'.

В обоих случаях следует использовать buffer [5] или malloc (5). В memset () нет необходимости, лучше поставить буфер [4] = '\ 0' после recv ().

3
ответ дан 8 December 2019 в 03:54
поделиться

Вы не можете получить более 4 char s, так как вы только запросили recv , чтобы в ваш файл было помещено не более 4 байтов. буфер. Вы должны проверить возвращаемое значение recv , чтобы увидеть, сколько байтов было фактически возвращено.

Я подозреваю, что проблема в том, что вы не заботитесь о выводе только 4 char s из любой подпрограммы, генерирующей вывод. Один из способов отображения начального содержимого буфера char , который, возможно, не завершается нулевым символом, состоит в следующем.

printf("%.4s\n", buffer);

Полный фрагмент вызова recv может быть таким:

#define MAX_BUF_LEN (512)
char buffer[MAX_BUF_LEN];
ssize_t count = recv(socket, buffer, MAX_BUF_LEN, 0);

if (count > 0)
    printf("%.*s\n", count, buffer);
2
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: