memcpy在复制时错了int

时间:2014-03-28 11:10:56

标签: c char int memcpy

这是两个小程序,第一个返回正确的结果,第二个不是。它们对我来说几乎是一样的,但为什么第二个程序会返回错误的结果呢? 我的意思是测试函数应该打印与main中相同的值,但在第二个程序中它不会。

计划#1

    #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<stdint.h>

int test(const char *buf)
{
    printf("TEST HERE\n");
    int c = 33;
    int d = 44;
    memcpy(&c, &buf+1, 4);
    memcpy(&d, &buf+5, 4);

    printf("c is %d\n", c);
    printf("d is %d\n", d);
}
int main()
{
    char *buf = malloc(100);
    char buf2[100];
    int a = 11;
    int b = 22;
    int c = 33;
    int d = 44;
    int i;
    for(i = 0; i < 100; i++)
    {
        buf[i] = 0;
        buf2[i] = 0;
    }
    buf[0] = 127;
    memcpy(buf+1, &a, 4);
    memcpy(buf+5, &b, 4);
    memcpy(&c, buf+1, 4);
    memcpy(&d, buf+5, 4);   
    printf("c is %d\n", c);
    printf("d is %d\n", d);
    memcpy(&buf2+1, &a, 4);
    memcpy(&buf2+5, &b, 4);
    memcpy(&c, buf+1, 4);
    memcpy(&d, buf+5, 4);   
    printf("c is %d\n", c);
    printf("d is %d\n", d);
    test(buf);
    test(buf2);
}

计划#2

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<stdint.h>
int test(const char *buf)
{
    printf("test here\n");
    int b = 55555;
    int d = 55555;
    memcpy(&b, &buf+1, 4);
    memcpy(&d, &buf+5, 4);
    printf("b is %d\n", b);
    printf("d is %d\n", d);

    return 0;
}
int main()
{
    int a = 11;
    int b = 22;
    int c = 33;
    int d = 44;
    char buf[100];
    int i;
    for(i = 0; i<100;i++)
    {
        buf[i] = 0;
    }
    memcpy(&buf+1, &a, 4);
    memcpy(&buf+5, &c, 4);
    memcpy(&d, &buf+5, 4);
    memcpy(&b, &buf+1, 4);
    printf("b is %d\n", b);
    printf("d is %d\n", d);
    test(buf);
    return 1;
}

程序1输出:

c is 11
d is 22
c is 11
d is 22
TEST HERE
c is 1
d is 22
TEST HERE
c is 1
d is 22

程序2输出:

b is 11
d is 33
test here
b is -1056904720
d is 0
"test here"

之后

b应为11

d应为33

感谢无论谁回答这个问题!

2 个答案:

答案 0 :(得分:2)

test()函数中的memcpy()错误。

int test(const char *buf) {
                    ^^
                   a pointer !

   memcpy(&b, &buf+1, 4);
   memcpy(&d, &buf+5, 4);

然后获取传入指针的地址并为其添加偏移量,但不会 点任何地方有效。所以你调用未定义的行为,如果你的program #1恰好工作了,你 很幸运。

您必须使用:

memcpy(&amp; b,buf + 1,4);    memcpy(&amp; d,buf + 5,4);

main()中存在相同的错误。在main中,您有char buf[100];,这是一个数组,而不是指针。您的指针算术(&buf + 5)不会向buf的开头添加5个字节,但它会向指针添加5*sizeof buf个字节,并且您再次将字节复制到无效空间,你的阵列外面。 main()中的代码必须是:

memcpy(buf+1, &a, 4);
memcpy(buf+5, &c, 4);
memcpy(&d, buf+5, 4);
memcpy(&b, buf+1, 4);

答案 1 :(得分:0)

更改测试功能

    int test(const char *buf)
    {
        printf("TEST HERE\n");
        int c = 33;
        int d = 44;
        memcpy(&c, buf+1, 4); // removed the & operator
        memcpy(&c, buf+1, 4); // removed the & operator

        printf("c is %d\n", c);
        printf("d is %d\n", d);
    }

也在main

 memcpy(buf2+1, &a, 4); // removed the & operator
 memcpy(buf2+5, &b, 4); // removed the & operator