[英]The memset() function
我是C / C ++的初學者,我遇到了以下代碼段:
#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
我相信上面的代碼是正確的,但代碼的原始作者認為其中有一個錯誤,任何人都可以給我一個提示嗎? 提前致謝。
strlen(szBuf)
(和strlen(szBufRaw)
)將僅在有效字符串上返回正確的結果。 你應該通過MAX_MSG
。
strlen()查找數組中的第一個空值,這意味着您不會在內存中設置正確的字節數。
使用MAX_MSG代替將整個數組設置為null。
兩個char數組都是未初始化的,對它們使用strlen()
是未定義的行為。 它不會做你期望的。
strlen()
遍歷一個字符串,給定指向其第一個字符的指針,並返回字符串的長度,即直到找到終止零。 使用new
創建這些數組后,它們不包含任何有意義的數組。 這些調用可能會返回任何內容,甚至可能導致程序崩潰。
你想要的是傳遞數組的大小:
memset(szBuf, ‘\0’, MAX_MSG);
memset(szBufRaw, ‘\0’, MAX_MSG);
strlen()
返回給定字符串的長度。
長度定義為頭部和尾部之間的長度,其值為\\0
。
在上面的代碼中, strlen()
不一定會返回MAX_MSG
,因為您還沒有初始化或設置某個值。
memset(szBuf, ‘\0’, sizeof(szBuf))
將工作。
strlen不會按預期運行,因為它計算NUL(0 ascii代碼)char之前的字節數。 你需要的是傳遞MAX_MSG而不是strlen。 順便問一下,這是家庭作業嗎?
在調用memset
之前,兩個緩沖區szBuf
和szBufRaw
是未初始化的。 但是,為了清除內存的長度,代碼會調用strlen
。 這不起作用,因為緩沖區不包含有效的字符串。 代碼應該清除緩沖區中的MAX_MSG
字節,而不是使用strlen
。
memset(szBuf, '\\0', strlen(szBuf));
什么strlen()
在那里做? 字符串在哪里?
strlen()
函數返回C樣式字符串中終止空字符之前的字符數。
memset(szBuf, '\\0', MAX_MSG);
應該管用。
new
未初始化內存對strlen()
表現strlen()
。
如果有人寫道,那會更好:
memset(szBuf, 0, MAX_MSG * sizeof *szBuf);
您也可以跳過sizeof *szBuf
因為它保證為1,但它沒有傷害。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.