2011-04-05 89 views
-2

因此,有我撞頭了兩晚在一排的一個問題:問題複製內存時

(tuple1和tuple2是空指針傳遞給這個函數)

char *data; 

data = (char*) calloc (76, 1); 
memcpy(data, tuple1, 32); 
memcpy(data+32, tuple2, 44); 

的想法是分配內存等於tuple1tuple2tuple1爲32字節,tuple2爲44)的大小之和,然後複製tuple1的32個字節並將它們粘貼到數據的地址,然後複製tuple2的44個字節並粘貼它們數據地址後的32個字節。

事情是,如果我只複製tuple1或只複製tuple2它真的被複制到應該是它的地方(我打印數據的方式太長的功能放在這裏),但是當我做兩個存儲器複製第一個memcpy()工作正常,但第二個沒有。

任何人都可以幫助我解決這個嚴重的問題嗎?

+0

你描述應該有什麼,由本身,工作。然而,爲什麼你沒有顯示的代碼會導致它不能工作,有許多原因。請發佈一個完整的程序,在編譯和運行時顯示問題;也描述它的作用,以及你期望它做什麼。 – zwol 2011-04-05 15:56:52

+0

證明它。顯示一個完整的程序,顯示你描述的行爲(當一個或另一個memcpy行被註釋掉時)。希望在將真實代碼縮減爲該演示的過程中,您會注意到它突然再次開始工作時,會告訴您什麼是錯誤的。 – 2011-04-05 15:57:44

+0

你怎麼知道第二個副本不起作用?你有什麼證據? – abelenky 2011-04-05 15:58:31

回答

1

我會懷疑對齊和/或填充問題,什麼是tuple1tuple2的類型聲明?

你怎麼知道他們的確切尺寸?硬代碼的代碼是可疑的,應該使用sizeof而不是魔術數字文字。

而且,你不應該將返回值的calloc(),在C.

1

與更小的東西,哪一個更容易調試開始實驗:

void* tuple1 = calloc(2, 1); 
char* content1 = "ab"; 
memcpy(tuple1, content1, 2); 

void* tuple2 = calloc(4, 1); 
char* content2 = "cdef";; 
memcpy(tuple2, content2, 4); 

char *data = data = (char*) calloc (6, 1); 
memcpy(data, tuple1, 2); 
memcpy(data+2, tuple2, 4); 

printf("%.*s\n", 6, data); // should print: abcdef 
+0

如果你打算假裝某些數據是一個字符串,不要忘記說明null終止符的不存在。提示:使用'printf(「%。* s \ n」,6,data);' – pmg 2011-04-05 16:11:34

+0

好,謝謝。 – karlphillip 2011-04-05 16:15:22

+0

所以,我發現了一些有趣的東西。我已經分配了84個字節的數據。我正在做第一個內存複製memcpy(data,tuple1,44);它從tuple1的地址複製44個字節到數據的地址,當我嘗試讀取數據時,事實證明它已經複製了tuple1的字節在前44個字節的數據上,然後再次複製了tuple1的44個字節直到它填充了分配給數據的字節84字節。這是爲什麼?!我該如何預防它? – 2011-04-05 20:56:43