2013-11-27 86 views
0

我試圖複製x個字節。大小被計數並打印出來(見下文)。我使用memcpy來複制計數的字節數量。但結果是我有時會得到更長的價值。哪裏不對?Memcpy副本更多,比預期

這是一些代碼:

size_t symlen = tmpP - cp; 
    char * triP = malloc(symlen); 
    printf("mallocated %zu\n", symlen) ; 
    memcpy (triP, tmpP - (symlen) , symlen); 
    printf(">>VAL %s<<\n", triP); 

下面是一些輸出,你可以看到,該值越長15個字符。

mallocated 15 
>>VAL 558657,1033,8144399,814<< 
mallocated 15 
>>VAL 558657,1033,8144399,814<< 
+1

''symlen'是否需要'printf'所需的尾部'\ 0'字符?是否有尾隨的'\ 0'? – Dirk

+1

以'%s'打印假定這是一個以零結尾的字符串。如果這是你寫的全部,你忘了(手動!)添加終止零。 – usr2564301

+1

什麼是tmpP,cp的類型? memcpy需要dst和src指針以及要複製的字節數,您要發送到memcpy的第二個參數是什麼?這可能是你正在閱讀垃圾數據 – Deepthought

回答

3

您應該再分配一個字節,並在其中寫入一個空字符來標記字符串的末尾。

size_t symlen = tmpP - cp; 
char * triP = malloc(symlen+1); 
printf("mallocated %zu\n", symlen) ; 
memcpy (triP, tmpP - (symlen) , symlen); 
tripP[symlen] = '\0'; 
printf(">>VAL %s<<\n", triP); 
2

這是因爲您尚未將空字節添加到memcpy的數據。它看起來像memcpy必須標記頁面複製字符串作爲寫入時複製,因此當訪問triP,其中一個實際上訪問tmpP,因此第二個printf中顯示的triP的值是tmpP而不是亂碼數據。