这是如何运作的?将任何东西复制到一个字节数组(字符)

Kai*_*ije 2 c c++ memory

struct MyRect
{
    int x, y, cx, cy;
    char name[100];
};

int main()
{
    MyRect mr;
    mr.x = 100;
    mr.y = 150;
    mr.cx = 600;
    mr.cy = 50;
    strcpy(mr.name, "Rectangle1");

    MyRect* ptr;

    {
        unsigned char bytes[256];

        memcpy(bytes, &mr, 256);

        ptr = (MyRect*)bytes;
    }

    printf("X = %d\nY = %d\nCX = %d\nCY = %d\nNAME = %s\n", 
        ptr->x, ptr->y, ptr->cx, ptr->cy, ptr->name);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是在测试如何将一个struct /类放在一个字节数组中,并且在编译和工作时很惊讶,printf打印出我在mr变量中设置的所有值.

只是有点困惑到什么"ptr"指向?它在某处为ptr分配了内存吗?

Cha*_*via 9

它纯粹的机会.

首先,您基本上是对结构进行逐字节复制,并使用它将其放入堆栈分配的缓冲区中memcpy.但是,你不应该在实践中这样做.这次碰巧工作了,因为你的结构是一个POD(普通旧数据或C结构),但如果你的结构是一个带有构造函数/复制构造函数的C++对象,或者你有什么东西,你可能会有一个讨厌惊喜.

其次,包含结构的堆栈分配缓冲区在你通过指针使用时超出了范围,所以你所做的是完全未定义的行为.它只能通过纯粹的机会工作,并且不能保证在不同的计算机上或使用不同的编译器,甚至在一天的不同时间再次工作.

  • 此外,未定义行为的另一个原因是,当结构的大小仅为116字节(根据实现而给予或接受)时,复制256个字节.因此,您可能将一半的调用堆栈复制到缓冲区中,导致更加搞笑的未定义行为. (2认同)