这是两个小程序,第一个返回正确的结果,第二个不是。它们对我来说几乎是一样的,但为什么第二个程序会返回错误的结果呢? 我的意思是测试函数应该打印与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
感谢无论谁回答这个问题!
答案 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