在C++中从函数返回时丢失的数组数据

在C++中从函数返回时丢失的数组数据,c++,C++,我确信这是一个新手问题,但我正在学习的这本书展示了如何将结构编码到缓冲区中。但是,这些示例仅适用于简单类型。我正试图通过使用动态数组进一步实现这一点 我的问题是调用encode后,调用函数可以看到bodyLen的值,但body的值丢失了。我做错了什么 伪代码: struct outData { uint32_t bodyLen; // Length of body uint32_t *body; // Array of body elements };

我确信这是一个新手问题,但我正在学习的这本书展示了如何将结构编码到缓冲区中。但是,这些示例仅适用于简单类型。我正试图通过使用动态数组进一步实现这一点

我的问题是调用encode后,调用函数可以看到bodyLen的值,但body的值丢失了。我做错了什么

伪代码:

struct outData
{
    uint32_t bodyLen;       // Length of body
    uint32_t *body;         // Array of body elements
};

int encode(uint8_t *buffer, int size)
{
    // Set the buffer to the data structure layout
    outData *myData = (outData *)buffer;

    // Junk data (a nice 10101010...)
    uint32_t junk = 2863311530;

    // Populate body
    uint32_t bodyData[size];
    for (int i=0; i<size; i++)
    {
        bodyData[i] = htonl(junk);
    }

    // Set the buffer
    myData->bodyLen = size;      // This works perfectly
    myData->body = bodyData;     // This is blank to calling function

    ...
}
谢谢

bodyData是一个局部变量,但您正在将myData->body设置为指向它。encode返回后,bodyData被销毁,*myData->body现在未定义


要修复此问题,您需要在使用新[]正确分配空间后,将bodyData的内容深度复制到myData->body中。然后您需要确保稍后删除[]。

这只是返回一个指向函数本地缓冲区的指针。这可能是一种常见的方法,但这个话题已经讨论了很多次。他们为什么要为new and delete或实际上new[]and delete[]而烦恼呢?只要使用std::vector,它就可以替换整个struct OutData。@Angew我同意这样可能更好;正如OP所说,这是一个学习练习,所以只需按照编写的代码进行处理。关于数组形式的一点很好,这真的很有帮助。现在看来很明显。非常感谢。