2013-02-11 52 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,讓您的打印的地址