簡體   English   中英

memset()函數

[英]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之前,兩個緩沖區szBufszBufRaw是未初始化的。 但是,為了清除內存的長度,代碼會調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM