2014-07-03 32 views
-1

我有以下一組代碼無法找到爲什麼我會得到垃圾值。我的意圖是將字節數作爲目標複製到源而不考慮源爲我的應用程序製作通用副本。但沒有得到正確的結果。有什麼辦法可以做到這一點。memset無法正常工作

int main() 
{ 
    char x[6]; 
    char *i="pra"; 
    memset(&x,0,6); //Doing memset 

    memcpy(&x,i,6); 
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]); 
} 

o/p: 
70 72 61 0 25 78 

我們可以看到0之後的輸出是garbage.But爲什麼它正在調用,它在哪裏來。 乳清memset無法正常工作。 Pleae有助於獲得這一概念的原因。

+0

使用'strncpy()函數(X,I,的sizeof X);'代替'memset的/ memcpy'儘可能多i'儘可能'填充以0如果需要複製,而不過/欠填充'x', 。 – chux

回答

6

您複製i六個字節到x,但只有四個字節非垃圾值的i,所以最後兩個是什麼碰巧i後。

+0

我的意思是..什麼?這是在文本或哪個部分。 – pradipta

+2

@pradipta:讀取數組的末尾,這是你正在做的,是未定義的行爲。這是一個錯誤,你應該修復它。 – Blastfurnace

+0

感謝Blastfurnace,但是..如果我使用源的長度,那麼也會導致錯誤,如果源的數量少於這個數字。 – pradipta

2

您正在複製6個字節我的,而其長度爲4。否則,將解決這個問題:

memcopy(&x, i, strlen(i)); 
+0

在這種情況下,如果x小於源,那麼未定義的行爲將是結果 – pradipta

+1

1)它是'memcpy'; 2)這將不必要地走'i'兩次,不會NUL終止'x'。 –

+2

@MatteoItalia是對的。這正是'strcpy()'和'strncpy()'的發明目的。 – glglgl

2

memset的()工作正常。但是memcpy()應對垃圾數據到緩衝區。

int main() 
{ 
    char x[6]; 
    char *i="pra"; 
    memset(&x,0,6); //Doing memset 
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]); // All will be 0 here 
    memcpy(&x,i,6); //6 bytes here mentioned is reponsible for that values 
    printf("%x %x %x %x %x %x",x[0],x[1],x[2],x[3],x[4],x[5]); 
} 
+0

垃圾來自where.I需要實現一個通用副本,而不考慮源長度。長度應該是目的地。 – pradipta

+1

@pradipta:這是不可能的。 –

+0

@pradipta,堆棧中的這些垃圾可能是。因爲x []是本地的。 – Jeyaram