直接賦值,或者借助建構函式。
char * msg = "asdf123你好";
qstring str1 = msg;
qstring str2 = qstring(msg);
方法1:(區域性呼叫)
//正確的寫法
qstring qstr = qstring("asdf123你好");
qbytearray bytearray = qstr.toutf8();
char * ch_1 = bytearray.data();
//錯誤的寫法
char * ch_2 = qstr.toutf8().data(); //存在安全隱患
簡單分析下 ch_2 錯誤的原因:
分析語句:char * ch_2 = qstr.toutf8().data();qstr.toutf8() 返回乙個qbytearray型別的臨時結果(以下稱temp),再由temp.data()將記憶體指標傳出,賦值給ch_2。
這個過程如果寫在一行表示式裡,temp的生命週期在傳回指標的那一刻就結束了,因此ch_2指向的記憶體資料是不可預料的。
(如果直接測試ch_2,會得到與ch_1同樣的結果,但這只是一種表象,存在很大的安全隱患。原因:雖然中間變數temp的生命週期已經結束,但temp所占用過的記憶體依然存在,如果在呼叫ch_2之前該記憶體的資料沒有被覆蓋過,確實會得到與ch_1相同的結果。)
【方法2】更健壯。
方法2:(qt 官方示例)
qstring tmp = "test";
qbytearray text = tmp.toutf8();
char *data = new char[text.size() + 1];
strcpy(data, text.data());
// ...業務**...
delete data;
QT QString與char 之間的轉換
1.qstring 轉char 先將 qstring 轉換為qbytearray 再將qbytearray 轉換為char 注意 不能用下面的轉換形式 char mm str.tolatin1 data 因為這樣的話,str.tolatin1 得到的qbytearray 型別結果就不能儲存,最後轉換...
char 與char 的區別
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於 資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料 結構中的堆是兩回事,分配方式倒...
char陣列與char指標
1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...