C: байт-копия беззнакового значения символа - PullRequest
2 голосов
/ 09 декабря 2010
void callback(const unsigned char* data, int len) {
 unsigned char copydatahere;
}

data - это указатель на константу, который размещается в библиотеке снаружи.len - это размер данных, предполагающий, что это sizeof (unsigned char) * N.

Как мне выделить copydatahere для размера len и скопировать всю память за data, включая нулевые байтысимволы завершения строки и что-нибудь еще, что имеет представление байта?Какая разница между bcopy и memcpy в этой ситуации?


Добавление: memcpy(pointer+offset, sourcedata, size); Вот как вы можете делать 'memcpy append', ребята.Спасибо всем!

Ответы [ 4 ]

3 голосов
/ 09 декабря 2010

Используйте memcpy.bcopy поддерживается только на некоторых платформах и устарела в новых стандартах.

void callback(const unsigned char* data, int len) {
  unsigned char* copydatahere = malloc(len);
  if (!copydatahere) {
    exit(1);
  }
  memcpy(copydatahere, data, len);

  /* ... */

  free(copydatahere);
}
2 голосов
/ 09 декабря 2010

Выделить с помощью malloc(3), разблокировать с free(3).bcopy(3), хотя и устарел (поэтому предпочитает memmove(3)), обрабатывает перекрывающиеся области памяти, memcpy(3) нет.

1 голос
/ 09 декабря 2010

Просто создайте массив

void callback(const unsigned char* data, int len) {
 unsigned char copydatahere[len];
 memcpy(copydatahere, data, len);
}

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

Однако не все компиляторы поддерживают массивы с переменным размером.

1 голос
/ 09 декабря 2010
#include <assert.h>
#include <stdlib.h>

void callback(const unsigned char *data, int len) {
  assert(len >= 0);
  unsigned char *copy = malloc(len);
  if (copy == NULL) { abort(); }
  memcpy(copy, data, len);
  /* TODO: Store the length somewhere, since otherwise the pointer is useless. */
  /* TODO: pass the pointer "copy" somewhere, so it is used. */
}

Обычно вторым аргументом такой функции обратного вызова является тип без знака, например unsigned int или size_t. Поэтому я добавил assert, просто чтобы быть уверенным, что не будет никакого неопределенного поведения .

memcpy четко определен в стандарте C, в то время как bcopy является старой версией и не гарантирует, что она будет существовать или даже работать так, как вы ожидаете. (Хотя обычно, если он существует, он будет делать то, что вы ожидаете.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...