memcpy 混淆溢出/用 gcc 覆盖?

memcpy confusion overflow / overwriting with gcc?

不确定我在这里做错了什么。我猜测它的内存对齐问题,但对于为什么会发生这种情况感到困惑。使用 gcc 7.4.0 和 onlinegdb.com 在本地进行测试。 (可以在这里复制代码并粘贴/编译确认)

适用于将数据类型转换为 char/uint8_t 但 int 或 short/uint16_t 无效(data2 结构成员被修改)。

#include <stdio.h>

struct test {
    int *data;
    int *data2;
};

struct test *Test=NULL;
int buffer[] = {1,2,3,4,5};

int main()
{
    Test = malloc(sizeof(struct test));
    memset(Test, 0, sizeof(struct test));

    printf("Before memcpy %d\r\n", Test->data2);

    Test->data = malloc(sizeof(buffer));
    memcpy(&Test->data, buffer, sizeof(buffer));

    printf("After memcpy %d\r\n", Test->data2);

    return 0;
}


data2 struct member is expected to be 0, however the value has changed after the memcpy for struct member data is executed.

Output:

Before memcpy 0
After memcpy 3

memcpy(&Test->data, buffer, sizeof(buffer));

您正在传递变量 data 的地址,它是一个指针,并向其复制比其边界更多的字节,这就是修改变量 data2 的原因(作为指针,Test->data 有 4 或 8 个字节,具体取决于您使用的架构 运行 代码)。

您可能希望将 Test->data 传递给 memcpy 作为其 dst 参数,而不是 &Test->data