[英]Are c styled strings safe?
在c / c ++中,有些人使用c樣式的字符串,例如:
char *str = "This is a c-styled string";
我的問題是這樣安全嗎? 我看到的方式是他們創建了一個char指針,該指針指向char的const數組的第一個字母,但是其他內容(例如另一個變量)不能覆蓋內存中char數組的一部分嗎? 從而導致str在邏輯上無效?
這些天來,字符串常量位於二進制文件的只讀部分中。 如果您嘗試寫入只讀部分中的地址,則CPU的內存管理單元將導致故障,並且您的應用程序將出現訪問沖突或分段錯誤或某些其他依賴於操作系統的行為。
另外,如果您將字符串常量的類型聲明為非const,則編譯器會發出警告。
但是其他東西(例如另一個變量)不能覆蓋內存中char數組的一部分嗎?
他們一定不能那樣做。 原因是您的C字符串文字是一個常量 ,正確地應將其聲明為一個:
char const* str = "This is a c-styled string";
僅允許您的(非const)代碼與舊版C代碼不兼容。 嘗試修改數據會導致未定義的行為。
事物與您制造的事物一樣安全。 您可以像字符串一樣輕松地覆蓋堆棧中的整數。 實際上,在某些情況下,您所擁有的內容更安全(因為它很可能位於只讀內存部分中)。
如果人們不知道自己在做什么,就不應該使用C。 就像他們在沒有經過適當培訓的情況下不應該使用電鋸一樣。 C語言的整個存在是系統編程語言。 它使您完全有能力做自己想做的事情。 權力伴隨着責任。
這是不安全的。 但是C / C ++中的其他任何東西也是如此。 您可以輕松覆蓋其他對象使用的內存部分。
它們和您的編程習慣一樣安全。 只要您知道如何正確使用它們,它們就絕對安全。 對於那些編程風格讓人想到中國商店里的大象的人來說,這樣的字符串可能並不安全。 但是關於整個C / C ++語言可以說相同的話。
您最初的單行聲明示例已經遇到了不安全的樣式問題。 在C和C ++中,字符串文字都是不可修改的左值。 創建指向此類文字的[長壽命]非常量指針不是一個好主意。 通常,它應該如下所示
const char *str = "This is a c-styled string";
注意額外的“ const”。
(在C中不能總是遵循此特定規則,但是通常只需要在一些受良好控制的本地慣用代碼中違反它即可。)
實際上不這樣做:
int *foo = 0x1234;
byte[] bytes = (byte[]) foo;
bytes[0] = 0x56;
printf("%d\n", *foo);
也就是說,任何指針如果使用不當都是危險的。
取決於您所說的“安全”。
它們本質上不比C / C ++中的任何其他指針使用安全。 指針通常要求您對內存非常小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.