2010-12-08 3 views
2
void callback(const unsigned char* data, int len) { 
unsigned char copydatahere; 
} 

Данные представляют собой ситуацию с указателем на константу, которая выделяется в библиотеке снаружи. len - это размер данных, предполагая, что это sizeof (unsigned char) * N.C: byte-copy unsigned char value

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


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

ответ

3

Использование 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); 
} 
1
#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 - это старая версия и не гарантируется существование или даже работа, как вы ожидаете. (Хотя обычно, если он существует, он будет делать то, что вы ожидаете.)

2

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

1

Просто создать массив

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

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

Не все компилируемые массивы поддержки с переменным размером.

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