memmove не копирует все содержимое буфера - C

У меня есть следующий код, в котором я пытаюсь создать буфер длиной 7 байт, а затем поместить целое число в сетевом порядке байтов вместе с массивом символов в буфере, у меня не должно быть символа Null в конце моего sprintf() буфер, поэтому я использую memcpy(), чтобы просто скопировать 7 байтов. Однако после memcpy() я получаю разные буферы.

Код:

int num = 1234;
char *dummy = "bla";
int dummy_len = strlen(dummy);
int buffer_len = sizeof(int) + dummy_len;
char *buffer = malloc(buffer_len);
char *temp_buf = malloc(buffer_len);
size_t len = buffer_len;

sprintf(temp_buf, "%d%s",htonl(num),dummy); //preparing the temp_buf
memmove(buffer, temp_buf, len); 
printf("sizeof(temp_buf) = %d and sizeof(buffer) = %d\n",sizeof(temp_buf), sizeof(buffer));
printf("printing buffer = %s and temp_buf = %s\n", buffer,temp_buf);

Я получаю следующий вывод:

sizeof(temp_buf) = 4 and sizeof(buffer) = 4
printing buffer = -771489 and temp_buf = -771489792bla

person Zahaib Akhtar    schedule 20.10.2013    source источник


Ответы (2)


Вам не нужен sprintf, просто скопируйте данные напрямую.

int temp = htonl(num);
memmove(buffer, &temp, sizeof(temp));
memmove(buffer+sizeof(temp), dummy, strlen(dummy));
person Chris Olsen    schedule 20.10.2013

Нелогично использовать sizeof(int), а затем sprintf(...,"%d... Не все 4-байтовые целые числа печатаются с 4 десятичными цифрами.

В частности, htonl(num), скорее всего, не будет печататься с 4-значным десятичным представлением. Поэтому sprintf() переполняет буфер temp_buf.

Вы должны использовать что-то вроде:

uint32_t n = htonl(num);
memcpy(temp_buf, &n, sizeof(n));
person Pascal Cuoq    schedule 20.10.2013
comment
Да, я просто использовал len = 13, и содержимое буфера такое же. Хорошо, есть ли альтернативный способ, с помощью которого я могу преобразовать свой int в сетевой порядок байтов, сохранив его размер в 4 байта? - person Zahaib Akhtar; 21.10.2013
comment
@ZahaibAkhtar Если вы не пытаетесь получить строку для печати, то memcpy() должно работать нормально. Если вам нужно получить печатную строку или по какой-то причине ограничиться десятичными цифрами, то невозможно с помощью счетного аргумента представить целые числа в диапазоне от -2^31 до 2^31-1 в строке, которая находится в диапазоне от от 0000 до 9999. - person Pascal Cuoq; 21.10.2013
comment
Да, ваши предложения верны, как и предложение @Chris Olsen. Это добавило мне знаний! - person Zahaib Akhtar; 21.10.2013