C string型別字串的儲存方式

2021-09-06 10:13:37 字數 994 閱讀 8212

不知道你們有沒有看過string型別變數的成員資料,在string變數中好像真正儲存字串的是乙個叫_ptr的指標,它指向string所儲存的字串首位址。當string變數被定義時,如果未初始化,_ptr就是乙個指向null的指標,而且_ptr看起來像乙個const char*型別的指標,如果它是乙個空串,你無法使用str[0]='w'這樣的賦值語句(假設str為string型別)。

問題如下:

1)當我們向string變數賦值時,它是通過動態分配記憶體給_ptr來儲存字串,還是通過其他的什麼方式來儲存字串的?

2)如果說是通過其他方式來儲存字串,那麼系統到底為string變數提供了多大的儲存空間?

3)這個儲存空間是位於堆上還是位於棧上?如果定義了較多的string變數,會不會占用過多的儲存空間,造成儲存空間的極大浪費?

結果如下:

char* ptr; // 記憶體指標, 用來儲存字串

size_t cap; // 動態記憶體的長度

size_t len; // 字串的長度

實際的實現會更加複雜, 而且是模板.

賦值的時候

先檢查 ptr是不是 null, 如果是的話分配足夠的動態記憶體.

如果ptr不是null, 那麼檢查cap是否足夠放下字串, 如果不足的話重新分配記憶體.然後呼叫std::copy或者strcpy之類的函式, 把字串複製到ptr中.

(1)它是通過動態分配記憶體給_ptr來儲存字串,還是通過其他的什麼方式來儲存字串的?

動態記憶體.

(2)系統到底為string變數提供了多大的儲存空間?

這個要看具體的實現定義, 不同的實現之間並不一樣, 不過通常來講, 只會分配必要的記憶體,也就是"asdf"這樣的字串只會分配5個char.

(3)這個儲存空間是位於堆上還是位於棧上?

堆(4)如果定義了較多的string變數,會不會占用過多的儲存空間,造成儲存空間的極大浪費?

不會, string和vector不一樣, 一般不會為元素預留記憶體, 不存在浪費.

C string 字串匹配

c inlcude c include find 在乙個字串中查詢乙個指定的單個字元或字元陣列。如果找到,就返回首次匹配的開始位置 如果沒有查詢到匹配的內容,就返回string npos。find first of 在乙個目標串中進行查詢,返回值是第乙個與指定字元組中任何字元匹配的字元位置。如果沒有...

C string 字串函式

december 8,2012 程式設計指南 和 連線字串 字串賦值 和 字串比較 例如a b,aa ab 比較字串 輸出 輸入字串 注意 使用過載的運算子 時,必須保證前兩個運算元至少有乙個為 string 型別。例如,下面的寫法是不合法的 include include intmain stri...

C string(字串)總結

string是在c 標準模板庫中的資料型別,string型別的物件用來存放字串,且不用擔心字串越界問題,標頭檔案為 string 變數名 1 string s1,s2 定義物件s1,s2,沒有初始化,string s3 hello 定義物件並初始化 cin s1 s2 輸入 abc defg cou...