我有一個概念上的疑問。char ch [] =「一些字符串」;
char ch[20]="some string";
我想知道ch是如何被存儲的,即是否分配了20個字節或只是分配給它的字符串的長度?我們可以在這裏訪問ch [18]這樣的東西嗎?
我有一個概念上的疑問。char ch [] =「一些字符串」;
char ch[20]="some string";
我想知道ch是如何被存儲的,即是否分配了20個字節或只是分配給它的字符串的長度?我們可以在這裏訪問ch [18]這樣的東西嗎?
我想知道
ch
是如何被存儲20
字節即是否分配或分配給它的字符串只是長度?
它創建按名稱ch
是20
字符長,並與「串一些」 initalizes它的陣列。
是的,該數組的大小是20個字節。
我們可以在這裏訪問ch [18]這樣的東西嗎?
是的我們可以。甚至修改內容。
良好閱讀:
What is the difference between char a[] = 「string」; and char *p = 「string」;
要評論回答問:
+---+---+---+---+---+---+----+----+----+----+----+----+----+ +----+----+
ch:| s | o | m | e | | s | t | r | i | n | g | \0 | | | b | \0 |
+---+---+---+---+---+---+----+----+----+----+----+----+----+ +----+----+
0 1 2 3 4 5 6 7 8 9 10 11 12 ...... 18 19
當你這樣做,
ch[18]='b';
修改只發生在你看不到的地方。
printf
通過檢測\0
來確定字符串的結尾。當初始化它時,\0
被放置在字符串的末尾。C/C++中的規則在給定初始化器時聲明數組時,任何未初始化的元素都會自動設置爲0.如上圖中所示,修改後的字符放在printf
認爲是字符串結尾之後,因此在printf
的輸出中看不到它。
如果您通過迭代遍歷for循環輸出每個字符的字符串,您可以看到您的修改。
是的,你可以訪問ch [18],你在你的常量字符串仍然存在的時候過了數組和字節,完整的未初始化的數據。看看內存位置。
是否20字節分配
是的,因爲你告訴它這樣做20個字節分配。只是數組的前12個字節將使用您的字符串及其尾隨的NUL初始化爲,其他字節用零填充。但是,您仍然可以訪問(讀取和寫入)數組的所有20個字節,即i。即從ch[0]
到ch[19]
。
如果你寫了
char ch[] = "some string";
然後ch
會被創建爲12個元素的數組:
{ 's', 'o', m', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 }
,然後纔將它一直錯誤嘗試讀取或寫入過去數組的邊界,我。即ch[12]
和更高的索引將會調用未定義的行爲。
如果你寫
char *ch = "some string";
這是非常糟糕的,如果你需要一個字符串作爲字符指針,你應該寫
const char *ch = "some string";
在這種情況下,ch
指針指向12字節長的字符串,其中的字符是恆定的,所以它們是隻讀的 - 嘗試修改它們(除了讀出邊界)還是未定義的行爲。
感謝您的幫助。 – MasterWayne
`how ch is being stored` and `whether 20 bytes are allocated`
實際分配了20個字節,並且分配的存儲器地址是恆定的。 「ch」這裏是一個指向分配內存第一個字節(或字符)的指針。而「ch + 1」指向分配內存的第二個字節。
Can we access something like ch[18] here?
如果字符串的長度比你所請求的存儲器的大小(20在這種情況下)更短,仍獲得所請求的大小,並且在其他字節值不是一定(可以是0或不是,但在vc6中,它經常被初始化爲0)。可以訪問ch [18],但值可能未知。所以如果你想訪問它們,你可能需要努力將它們初始化爲0。
我試過這個,但沒有得到編輯後的字符串。 char ch [20] =「一些字符串」; CH [18] = 'B';的printf(CH);可能是什麼問題呢? – MasterWayne
「printf()」將停止在'\ 0'處,通過將其他字節初始化爲''(空格)和'\ 0'作爲最後一個字節,可以實現您想要的結果。 – Al2O3
由於您聲明它使用20個字節,因此20個字節分配給ch
。是的,你可以訪問ch [18]。
的問題
char ch[20] = "some string";
ch[18] = 'b';
printf("%s",ch);
是字面「一些字符串」存儲包括其NULL
終止,所以當你打印字符串只打印,直到第一個空終止。
感謝您的鏈接。 – MasterWayne
我試過這個,但沒有得到編輯後的字符串。 char ch [20] =「一些字符串」; ch [18] ='b'; printf(ch); – MasterWayne
可能是什麼問題? – MasterWayne