2011-01-23 40 views
2

我是一個初學者到C/C++,和我碰到下面的代碼段傳來:的memset的()函數

#define MAX_MSG 1000 
char *szBuf = new char[MAX_MSG]; 
char *szBufRaw = new char[MAX_MSG]; 
memset(szBuf, ‘\0’, strlen(szBuf)); 
memset(szBufRaw, ‘\0’, strlen(szBufRaw)); 

我讀過有關的memset這裏的教程:

http://www.java-samples.com/showtutorial.php?tutorialid=591

我相信上面的代碼是正確的,但代碼的原始作者認爲其中有一個錯誤,有人可以給我一個提示嗎? 在此先感謝。

回答

6

strlen(szBuf)(和strlen(szBufRaw))只會在有效字符串上返回正確結果。相反,您應該通過MAX_MSG

3

這兩個char數組都是未初始化的,對它們的使用是strlen()是未定義的行爲。它不會做你期望的。

strlen()遍歷一個字符串,給出指向它的第一個字符的指針,並返回字符串的長度,也就是說,直到找到終止的零。在用new創建這些陣列後,它們不包含任何有意義的內容。這些調用可能會返回任何內容,甚至可能會導致程序崩潰。

你想要的是傳遞數組的大小:)

memset(szBuf, ‘\0’, MAX_MSG); 
memset(szBufRaw, ‘\0’, MAX_MSG); 
+0

在`new`返回之前它們都不會被清零嗎? – cHao 2011-01-23 15:18:31

6

的strlen(查找數組中的第一個空值,這意味着你不會在memset的字節適量記憶。

改爲使用MAX_MSG將整個數組設置爲null。

1

strlen不會像您期望的那樣工作,因爲它會計算NUL(0 ascii code)char之前的字節數。你需要傳遞MAX_MSG而不是strlen。順便問一下,這是功課嗎?

0

在致電memset之前,兩個緩衝器szBufszBufRaw未初始化。但是,要清除內存的長度,代碼將在其上調用strlen。這將不起作用,因爲緩衝區不包含有效的字符串。代碼應該在緩衝區中清除MAX_MSG字節,而不是使用strlen

0

memset(szBuf, ‘\0’, strlen(szBuf));

請告訴我strlen()在那裏做什麼?琴絃在哪裏?

strlen()函數返回C風格字符串中終止空字符 之前的字符數。

memset(szBuf, ‘\0’, MAX_MSG);應該工作。

0

new分配的未初始化內存將不會與strlen()表現良好。

它會更好,如果一書中寫道:

memset(szBuf, 0, MAX_MSG * sizeof *szBuf); 

你也可以跳過sizeof *szBuf因爲它保證是1,但它不會傷害。

3

strlen()返回給定字符串的長度。
長度定義爲頭部和尾部之間的長度,其值爲\0

在上面的代碼中,strlen()不一定會返回MAX_MSG,因爲您尚未初始化或設置某個值。

memset(szBuf, ‘\0’, sizeof(szBuf)) 

將工作。