這個問題在這里已經有了答案: 越界訪問陣列有多危險? (11 個回答) 陣列索引越界行為 (10 個回答) 沒有越界錯誤 (7 個回答) 7 小時前關閉。
int main ()
{
char *strA = "abc";
int tam_strA = strlen(strA);
char strB[tam_strA];
strB[0] = 'a';
strB[1] = 'b';
strB[2] = 'c';
strB[3] = 'd';
strB[9] = 'z';
printf("%c", strB[9]);
return 0;
}
它通常列印“z”。為什么它不回傳分段錯誤錯誤?因為我試圖訪問一個不應該存在的索引,因為 strB 的大小(索引數量)等于 tam_strA 等于 3。
另外,這樣做有什么區別/問題char strB[strlen(strA)];嗎?
uj5u.com熱心網友回復:
C 語言沒有阻止您訪問無效記憶體的規范,也不保證出現分段錯誤。唯一做出的承諾是,如果您嘗試訪問無效記憶體,將導致未定義行為。
分段錯誤是可能的結果之一,而不是唯一的結果。
也就是說,唯一的問題是
char strB[strlen(strA)];
也就是說,strB將不足以容納 中的內容strA,因為它將缺少一個位元組來容納空終止符。當然,按位元組使用是可以的,但是如果您想復制內容(或與 長度相同的任何內容strA)并strB用作string,您將運行分配的記憶體(在沒有空終止符的情況下) ,呼叫未定義的行為。
uj5u.com熱心網友回復:
只有在訪問不屬于您的記憶體時才會出現分段錯誤。您擁有整個堆疊。strB[9]是作業系統眼中的有效記憶體訪問。您不應該這樣做的原因是編譯器不知道您正在使用該記憶體,因此它可能決定將該記憶體用于其他用途。它還有助于提高可讀性和減少程式員的錯誤。而且,該標準將未宣告記憶體的使用定義為未定義行為,因此您不能安全地使用它。宣告一個像int x;(或陣列)這樣的變數告訴編譯器你將使用記憶體在x.
這實際上與這個問題有關:為什么定義陣列之外的第一個元素默認為零?. 閱讀那里更詳細的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/388740.html
上一篇:使用回圈更改字串中的選定字符
下一篇:在字串中查找子字串
