2014-03-28 55 views
0

這裏有兩個小程序,第一個返回正確的結果,第二個不是。他們看起來和我差不多,但爲什麼第二個程序返回錯誤的結果? 我的意思是測試函數應該打印與main相同的值,但在第二個程序中它不打印。memcpy錯誤int複製回

節目#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"

乙方應11

d應該是33

感謝誰可以回答這個問題!

+2

你爲什麼不解釋的區別是什麼,都在源代碼和結果中。 –

回答

2

你的memcpy()在test()函數中是錯誤的。

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

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

然後,您可以採取指針傳遞的地址,並添加偏移到,這不會 點的任何位置有效。所以你調用未定義的行爲,如果你的program #1碰巧工作,你 幸運。

必須使用:

的memcpy(& B,BUF + 1,4); memcpy(&d,buf + 5,4);

您在main()中有同樣的錯誤。在main你有char buf[100];,這是一個數組,而不是一個指針。您的指針算術(&buf + 5)不會將5個字節添加到buf的開頭,但會將5*sizeof buf字節添加到指針,並且再次將字節複製到陣列外的無效空間。 在main()的代碼必須是:

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

我按照你的建議做了,現在我得到: b是0 d是0 – user2783121

+0

@ user2783121也許你沒有改變所有6個memcpy()調用。 – nos

+0

謝謝你,那已經解決了問題! – user2783121

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