mempcy не в состоянии скопировать все данные - PullRequest
0 голосов
/ 01 июля 2010

Я столкнулся с проблемой с memcpy в C. Вот код:

typedef struct {
CPY_IM009_DEF
}message;

message msg;

с CPY_IM009_DEF - это структура в других файлах. Тогда я попробую это

char wx_msg_buf[8192];
memset(wx_msg_buf, 32, sizeof (wx_msg_buf));
memcpy(wx_msg_buf, &msg, sizeof (msg));

когда я проверяю размер:

sizeof (msg) = 2140

sizeof (wx_msg_buf) = 8192

Но когда я проверяю wx_msg_buf, memcpy копирует только часть сообщения в wx_msg_buf (200 из 2140). Я хочу знать, почему это происходит? Если требуется больше кода, скажите мне

Спасибо за помощь.

Ответы [ 5 ]

3 голосов
/ 01 июля 2010

Как вы проверяете? Просто печатать строку или смотреть на нее в отладчике? Если в сообщении есть символы «\ 0». Он остановит печать при первом.

Чтобы увидеть все это, вы можете просто просмотреть и напечатать каждый символ. Примерно так:

int i;
for(i = 0; i < sizeof(wx_msg_buf); ++i) {
   printf("%02x ", wx_msg_buf[i]);
}
1 голос
/ 01 июля 2010

Код выглядит хорошо для меня.Проблема может быть в том, как вы на это смотрите.Какова структура базовой структуры и какие инструменты вы используете, чтобы получить наблюдение о 2000 байтах?

0 голосов
/ 01 июля 2010

Хорошо, я меняю:

char wx_msg_buf[8192];

в

char wx_msg_buf[2141];

и теперь код работает, но я не могу понять, почему предыдущий не будет работать

0 голосов
/ 01 июля 2010

Попробуйте один раз;«memmove» вместо «memcpy» .. memcpy () быстрее, но это небезопасно для перемещения блоков памяти, где источник и место назначения перекрываются.memmove () может использоваться для перемещения памяти в таких случаях.

Так что лучше используйте "memmove" .. Я думаю, что это решит вашу проблему

0 голосов
/ 01 июля 2010

Проверьте ваши исходные данные и ваши результаты в отладчике.

Почти невозможно представить, что memcpy () имеет дефект, он так широко используется.

...