2017-10-15 26 views
-1

我正在創建一個項目,我需要創建一個任意長度的字符串並將所有字符設置爲特定字符。爲什麼使用memset手動設置字節時字符串縮短?

設置字節的例子:

char str[i]; 
memset(str, '*', i); 
str[i] = '\0'; 

這似乎工作至今,但是當我最後一行更改爲str[i + 1] = '\0';,我的輸出是由一個縮短。

任何人都可以解釋爲什麼發生這種情況?

+6

'str [i + 1]'不在界限內。 'str [i]'也不是。你聲明這個數組具有'i'元素,其索引從'0'到'i-1'。 – Ryan

+0

請提供[mcve]。 – rustyx

+0

請注意,做'int i = 42; char str [i];'使用名爲「Variable Length Arrays」的語言元素,它只能從C99獲得,並且已經成爲C11的可選項。 (根本不支持C++), – alk

回答

1
str[i] = '\0'; 

str[i + 1] = '\0'; 

是因爲C語言不檢查數組邊界不確定的行爲。

C11標準:

J.2未定義behavor

  • 數組下標超出範圍,即使對象是與所述給定標顯然可訪問(如在左值表達式 a [1] [7]給出了聲明int a [4] [5])(6.5.6)。
1

隨着str[i]str[i + 1]您正在訪問的str範圍之外。這是undefined behaviour

如果需要i長度的數據(不包括終止空字節),您的陣列str必須具有用於i + 1元件空間以容納空終止。另一方面,如果您不使用str作爲C字符串(例如,使用任何期望以空字符結尾的字符串的標準C庫函數),那麼您不需要在所有。

相關問題