C - MEMCPY 混淆溢出/使用 GCC 覆盖?



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

适用于将数据类型转换为字符/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 %drn", Test->data2);
Test->data = malloc(sizeof(buffer));
memcpy(&Test->data, buffer, sizeof(buffer));
printf("After memcpy %drn", 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

最新更新