C++ C++;C2466错误

C++ C++;C2466错误,c++,visual-studio,visual-studio-2008,char,C++,Visual Studio,Visual Studio 2008,Char,为什么我们可以这样做 for(int i = 0; i < destination->imageSize; i=i+3) { buffer[2] = destination->imageData[i]; buffer[1] = destination->imageData[i+1]; buffer[0] = destination->imageData[i+2

为什么我们可以这样做

        for(int i = 0; i < destination->imageSize; i=i+3)
        { 

            buffer[2] = destination->imageData[i];
            buffer[1] = destination->imageData[i+1];
            buffer[0] = destination->imageData[i+2];
            buffer+=3;
        }
那么如何处理这样的事情呢

对不起,我对C++ +… 顺便说一句:我的重点是创建一个函数,返回一个带有图像的字符。如果使用mem copy,如何删除返回值

  • 您无法返回本地数组。您返回的所有内容都需要有人免费提供

  • 本地数组的大小必须是常量。总是。这是因为C++中没有围绕数组的特殊逻辑。可以使用STL的某些对象集合


  • 我不得不问,为什么你认为他们有关联?如果您不能通过运行时变量对数组进行索引,那么即使存在数组,也毫无用处。声明由运行时变量控制的大小的变量是完全不同的,需要对编译器管理自动内存的方式进行根本性的更改

    <>这就是为什么你不能在C++中做这件事的原因。这可能会改变,但现在你不能


    如果您真的需要一个大小可变的数组,则需要动态分配一个数组。你可以用一种艰难的方法(
    char*buff=new char[size]…delete[]buff;
    ),也可以用一种简单、安全的方法(
    std::vector buff(size)
    )。你的选择。但是,您不能“在堆栈上”构建它。

    char buffer[destination->imageSize]在编译时声明变量。当时,
    destination->imageSize
    的值还不知道,这就是它不起作用的原因


    表达式
    buffer[2]=destination->imageData[i](或者更确切地说,其缓冲区[2]在运行时进行计算。

    Hmm。您是否尝试创建指向destination->imageSize的指针或引用,并将其传递给索引?

    使用std::vector,您可以实现所需的功能。您的函数可以定义如下:

    void readImage(std::vector<char>& imageData, std::string& filename)
    {
        size_t imageSize = 0;
        //read file and load imageSize
        imageData.resize(imageSize);
        // load image into imageData using such as you in your question
        for(int i = 0; i < destination->imageSize; i=i+3)
        { 
    
            buffer[2] = destination->imageData[i];
            buffer[1] = destination->imageData[i+1];
            buffer[0] = destination->imageData[i+2];
            buffer+=3;
        }
    }
    

    使用
    vector
    替代?问题是什么?为什么不能分配在运行时确定大小的数组?如何?您在手动内存管理方面有问题吗?哪些问题?还有别的吗?。。。但是const int iom=目的地->图像大小;字符缓冲区[iom];仍然是C2466@Kabumbus是的,因为正如Noah Roberts指出的那样,iom的值依赖于运行时右值。“但是,你不能在堆栈上构建它。”--你可以,但是alloca()不是一个标准函数,尽管它几乎存在于所有平台上。
    void readImage(std::vector<char>& imageData, std::string& filename)
    {
        size_t imageSize = 0;
        //read file and load imageSize
        imageData.resize(imageSize);
        // load image into imageData using such as you in your question
        for(int i = 0; i < destination->imageSize; i=i+3)
        { 
    
            buffer[2] = destination->imageData[i];
            buffer[1] = destination->imageData[i+1];
            buffer[0] = destination->imageData[i+2];
            buffer+=3;
        }
    }
    
    const int imageSize = 4242; 
    char imageData[imageSize]; // No C2466 error