2012-10-28 140 views
3

我有一個概念上的疑問。char ch [] =「一些字符串」;

char ch[20]="some string"; 

我想知道ch是如何被存儲的,即是否分配了20個字節或只是分配給它的字符串的長度?我們可以在這裏訪問ch [18]這樣的東西嗎?

回答

3

我想知道ch是如何被存儲20字節即是否分配或分配給它的字符串只是長度?

它創建按名稱ch20字符長,並與「串一些」 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循環輸出每個字符的字符串,您可以看到您的修改。

+1

感謝您的鏈接。 – MasterWayne

+0

我試過這個,但沒有得到編輯後的字符串。 char ch [20] =「一些字符串」; ch [18] ='b'; printf(ch); – MasterWayne

+0

可能是什麼問題? – MasterWayne

1

是的,你可以訪問ch [18],你在你的常量字符串仍然存在的時候過了數組和字節,完整的未初始化的數據。看看內存位置。

3

是否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字節長的字符串,其中的字符是恆定的,所以它們是隻讀的 - 嘗試修改它們(除了讀出邊界)還是未定義的行爲。

+0

感謝您的幫助。 – MasterWayne

1
`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。

+0

我試過這個,但沒有得到編輯後的字符串。 char ch [20] =「一些字符串」; CH [18] = 'B';的printf(CH);可能是什麼問題呢? – MasterWayne

+1

「printf()」將停止在'\ 0'處,通過將其他字節初始化爲''(空格)和'\ 0'作爲最後一個字節,可以實現您想要的結果。 – Al2O3

2

由於您聲明它使用20個字節,因此20個字節分配給ch。是的,你可以訪問ch [18]。

的問題

char ch[20] = "some string"; 
ch[18] = 'b'; 
printf("%s",ch); 

是字面「一些字符串」存儲包括其NULL終止,所以當你打印字符串只打印,直到第一個空終止。