2013-02-11 124 views
1

因此,我有以下几点:的memcpy整数缓冲

char * buffer = (char *) malloc(2*80 + 4); 
uint32_t networkedRin = htonl(student->rin); 

printf("RIN %u\n", student->rin); 

//Clear all memory and copy the first last and rin into the new buffer 
memset(buffer, '\0', 164); 
memcpy(buffer, student->firstname, 80); 
memcpy(buffer+80, student->lastname, 80); 
memcpy(buffer+160, &networkedRin, 4); 

printf("Networked rin: %u\n", networkedRin); 

printf("L5: %s %s %u\n", buffer, buffer+80, buffer+160); 

,我感到非常困惑,因为当我做印刷在年底的预期值是网络RIN值相同此前打印,但它不是,实际上它的垃圾是因为它随着每次运行而不断变化。现在我知道我应该使用sizeof或其他什么,但是我们被告知只使用4的硬编码值作为uint32,而不是。我试图从缓冲区中显示联网的rin号码时,为什么我会发生垃圾。

比如我的程序

RIN 60 
Networked rin: 1006632960 
L5: loller cats 16375984 


RIN 60 
Networked rin: 1006632960 
L5: loller cats 10260656 

两个运行后收到此输出我敢肯定它的东西简单,但我就是不能看到它。

+0

嗯,因为这是如何所有C我不能真的不知道为什么我用C++标记我只是习惯于在C++项目上工作我做过但是没有新的在这里。 – csteifel 2013-02-11 18:44:37

+0

这解释了* lot *。我将放弃该评论。谢谢。 – WhozCraig 2013-02-11 19:28:40

回答

4

buffer+160是不是你正在寻找的价值。
buffer+160是一个指针int,而不是你自己int

您必须对指针进行类型转换和取消引用以查看所需的值。

printf("L5: %s %s %u\n", buffer, buffer+80, *(uint32_t*)(buffer+160)); 
+0

谢谢我现在觉得我很愚蠢,但我现在处于时间紧张状态 – csteifel 2013-02-11 18:40:03

+0

一般来说,不能保证你只能从'char'指向'uint32_t'指针,最终得到一个有效的指针(由于对准)。在这种情况下,由于涉及到对齐,它会发生变化,但通常应该使用'memcpy'而不是转换和取消引用。 – 2013-02-11 18:42:04

+0

是的,我意识到这一点。这些印刷品实际上只是为我调试,并不会在最终产品中使用,因此它不会成为关键 – csteifel 2013-02-11 18:43:38

1
printf("L5: %s %s %u\n", buffer, buffer+80, buffer+160); 

buffer+160是一个指向char,让您的打印的地址