void callback(const unsigned char* data, int len) {
unsigned char copydatahere;
}
data是一个指向const的指针,它在库外分配。 len是一个数据大小,猜测它是sizeof(unsigned char)* N。
我如何将copydatahere
分配给len
的大小并将整个内存复制到data
后面,包括空字节,字符串终止字符和其他任何具有字节表示的字符串?在这种情况下,bcopy和memcpy之间会有什么区别?
增加:
memcpy(pointer+offset, sourcedata, size);
这就是你怎么做'memcpy append'的人。谢谢大家!
答案 0 :(得分: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 :(得分:2)
与malloc(3)
分配,与free(3)
一起发布。 bcopy(3)
,虽然已弃用(因此更喜欢memmove(3)
),但处理重叠的内存区域,memcpy(3)
没有。
答案 2 :(得分: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
是旧版本,不保证存在甚至按预期工作。 (虽然通常如果存在它会做你期望的。)
答案 3 :(得分:1)
只需创建一个数组
void callback(const unsigned char* data, int len) {
unsigned char copydatahere[len];
memcpy(copydatahere, data, len);
}
如果len
可以任意大(例如400万),那么最好使用malloc
,因为它可以告诉您分配是否成功(尽管某些配置中的某些操作系统)会欺骗你,告诉你足够的内存,只有当你试图访问它时才会崩溃)。如果上面的数组分配失败,则行为未定义。
但并非所有编译都支持具有可变大小的数组。