我有一个数组:
unsigned char data[dataLength];
和一个功能:
unsigned char* get_data(int length)
我想将函数的返回值分配给变量。
当我直接这样做
data = get_data(length);
编译器在抱怨:
将“ unsigned char *”分配给“ unsigned char [(((sizetype)((((ssizetype)frameLength)+ -1))+ 1)]”的不兼容类型
它与memcpy兼容:
memcpy(data, get_data(dataLength), dataLength);
但是我不想再次复制数据。
有人可以帮忙吗?
答案 0 :(得分:4)
在C中完成此操作的方式是通过参数传递:
void get_data (int length, unsigned char data[length]);
呼叫为:
get_data(dataLength, data);
现在,函数内的 data
将是与调用方中分配的对象相同的对象。无需复制,无需记忆。
答案 1 :(得分:1)
data
是堆栈分配的数组。尽管数组在作为函数参数传递时会衰减为指针,但它们不是指针,您不能为其分配指针。 get_data()
之类的函数中返回原始指针不是一个好主意,因为尚不清楚应该由谁以及如何释放它。std::array<unsigned char, dataLength>
的大小,则返回data
,否则返回std::vector<unsigned char>
。然后,您不必担心分配,释放和使用memcpy
。如果要重用现有缓冲区并避免新分配,请通过非常量引用将其传递(请参见 Lundin 的答案)。// 1.
std::array<unsigned char, dataLength> get_data();
auto data = get_data();
// 2.
std::array<unsigned char, dataLength> data;
void get_data(std::array<unsigned char, dataLength>&);
get_data(data);
// 3.
std::vector<unsigned char> get_data(int length);
auto data = get_data(length);
// 4.
std::vector<unsigned char> data;
void get_data(std::vector<unsigned char>& data, int length);
get_data(data, length);