指向数组强制转换的数组指针-C/C++;新手

指向数组强制转换的数组指针-C/C++;新手,c,arrays,pointers,casting,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

我有一个数组:

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);
但我不想再复制数据了


有人能帮忙吗?

在C中,这是通过参数传递实现的:

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

get_data(dataLength, data);
函数中的
数据
现在将与调用者中分配的对象相同。无需复印,无需记忆

  • 您的
    数据
    是堆栈分配的数组。虽然数组在作为函数参数传递时会衰减为指针,但它们不是指针,您无法为其分配指针
  • 从函数(如
    get_data()
    )返回原始指针不是一个好主意,因为不清楚应该释放谁以及如何释放它
  • 在C++中最简单的方法是返回<代码> STD::数组< /代码>如果在编译时已知代码>数据< /代码>大小,或者<代码> STD::vector < /代码>。这样,您就不必担心分配、解除分配和使用
    memcpy
    。如果要重用现有缓冲区并避免新的分配,请通过非常量引用传递它(请参见Lundin的答案)
    //1。
    std::数组get_data();
    自动数据=获取数据();
    // 2.
    std::数组数据;
    void get_数据(std::array&);
    获取_数据(数据);
    // 3.
    std::向量get_数据(int长度);
    自动数据=获取数据(长度);
    // 4.
    std::矢量数据;
    void get_数据(std::vector&data,int-length);
    获取_数据(数据、长度);
    
    复制/粘贴代码时,您似乎犯了一些错误。它是
    数据
    还是
    ?是
    getData()
    还是
    getu data()
    ?请尝试创建一个独立的例子:当然,谢谢。你不能避免复制,<代码>数据< /C>不是指针,而是一个在堆栈上分配的缓冲区,你不能给它指派一个指针。如果是C++,只需返回<代码> STD::向量< /代码>。你不能分配给一个数组。而且,数组不是指针,指针也不是数组。通过这样做,就你试图解决的问题提出一个新问题。(问你正在编程的语言。C和C++非常不同。)
    // 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);