指向数组强制转换的数组指针-C / C ++初学者

时间:2018-08-16 06:49:27

标签: c arrays pointers casting

我有一个数组:

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);

但是我不想再次复制数据。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

在C中完成此操作的方式是通过参数传递:

void get_data (int length, unsigned char data[length]);

呼叫为:

get_data(dataLength, data);
现在,函数内的

data将是与调用方中分配的对象相同的对象。无需复制,无需记忆。

答案 1 :(得分:1)

  1. 您的data是堆栈分配的数组。尽管数组在作为函数参数传递时会衰减为指针,但它们不是指针,您不能为其分配指针。
  2. get_data()之类的函数中返回原始指针不是一个好主意,因为尚不清楚应该由谁以及如何释放它。
  3. 在C ++中,最简单的方法是如果在编译时知道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);