2012-06-21 25 views
2
char imei_temp[14] = {0, }; 

strcpy(imei_temp, "00000000000000"); 

根據我的理解,這是有效的代碼。如何在內存中表示字符串c

但Klocwork正在說緩衝區溢出,'imei_temp'的數組索引可能超出範圍。大小爲14的數組'imei_temp'可能使用索引值0..14

+0

「大小14可能使用索引值0..14」 - >非常常見的錯誤假設。有效索引是0..13。 – Marlon

回答

13

這是一個緩衝區溢出,因爲您的緩衝區是14字節,但是您要寫入15個字節:14 ascii「0」並在結尾處爲空字節。

+1

「爲避免溢出,目標指向的數組大小應足夠長以包含與源(包括終止空字符)相同的C字符串,並且不應與內存中的源重疊。」 – Joe

3

當您使用"指定字符串時,它會在字符串的末尾添加一個隱含的\0,您試圖將15個字節複製到14個字節的緩衝區中。

請注意,當您使用' s指定字符時,不會發生這種情況。

+1

它沒有用''''指定,它是'strcpy'追加NUL字節這是個問題 – Ashe

+0

'strcpy'不會追加一個NUL,'strcpy'會從內存位置複製字符,直到找到一個NUL。實際上,如果你指定一個不是字符串的內存位置,可能會複製大量的字符,直到找到NUL,但是'strcpy'沒有附加NUL的機制。 NUL字節,你可以通過在整個數組的for循環中將字符串轉儲到char數組和字符串「printf(」%d「,array [i])」來證明這一點。 – OmnipotentEntity

+0

感謝您的回答,但正如您所說,它只會複製14個字節,而不是以空字符結尾的字符。所以代碼應該是有效的。 – shunty