的sprintf
操作的字符串字面在\x00
一審結束初始化,因爲NUL(U + 0000)終止字符串在C.(當你在字符串文字中寫\x00
時,編譯器沒有抱怨,這可以說是語言的一個錯誤特徵。)因此str[2]
訪問未初始化的內存,程序有權打印完整的廢話甚至崩潰。
去做你想要做什麼,只是消除sprintf
:
int main(void)
{
static const unsigned char str[32] =
{ 0x01, 0x00, 0x02 }; // will be zero-filled to declared size
printf("[%02x][%02x][%02x]\n", str[0], str[1], str[2]);
return 0;
}
(二進制數據應始終保存在無符號字符,而不是簡單的字符數組;或者uint8_t
如果您有它。因爲U + 0000終止字符串,我認爲使用數組文字而不是字符串文字編寫嵌入式二進制數據是更好的方式;但它更多的是鍵入,這是因爲在編譯時數據永遠不會被修改和知道;程序會在沒有它的情況下運行。如果你不打算,請不要聲明argc
和argv
使用它們。返回零,而不是一個,從main
來表示成功完成)
(使用sprintf
你使用它的方式是其他原因一個壞主意:舉例來說,如果你的二進制塊包含\x25
(也稱爲%
在ASCII),它會嘗試讀取附加的待格式化參數,並再次打印完整的無意義或崩潰。如果您有充分的理由不使用靜態初始化數據,那麼複製二進制數據塊的正確方法是memcpy
。)
我認爲它與「\ x00」有關。例如,如果我用\ x01替換上例中的「\ x00」,則輸出爲文件[1] [1] [2] ...仍然混淆 –
注意:要以便攜方式確定是否存在'int '是可打印的字符,使用'#include isprint(x)'。 –
chux