代碼 :
#include <iostream>
使用 命名空間 std.com.cn>。
int main() {
string str("aaaaaaaaaaaaaaaaaaaaaaaaa");
const char* temp;
temp = str.substr(0, str.length().c_str() 。)
printf(str.substr(0, str. length().c_str()) 。)
printf(temp);
const char* test = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"。
printf(test)。
return 0;
}
輸出:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。
?$P
??????
有人能解釋一下嗎?
uj5u.com熱心網友回復:
你的編譯器應該對這一行發出警告:
你的編譯器應該對這一行發出警告。
temp = str.substr(0, str. length().c_str()。
Warning C26815 指標懸空,因為它指向一個被銷毀的臨時實體。
正在發生的事情是,str.substr()正在創建(并回傳)一個std::string物件,但它沒有被分配到一個變數,而是用c_str()檢索其緩沖區的指標,但該物件本身也在這里被洗掉(你可以說'被放棄')。
因此,指向其緩沖區的指標不再有效。只是意外的是仍然有一些資料部分看起來是正確的。因此,你已經得到了未定義的行為。
uj5u.com熱心網友回復:
你分配臨時變數的方式是創建一個懸空的指標。一個懸空的指標是一個指向無效資料的指標,在這個例子中,無效資料是你從str.substring得到的子串。這個子串被釋放是因為它在程式中沒有被使用,你可以通過添加一個新的子串變數來糾正這個問題
#include <iostream>
使用 命名空間 std.com.cn>。
int main() {
string str("aaaaaaaaaaaaaaaaaaaaaaaaa");
const char* temp;
//this is the importent line.
string substr = str.substr(0, str.length()) 。
temp = substr.c_str();
printf(str.substr(0, str. length().c_str()) 。)
printf(temp);
const char* test = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"。
printf(test)。
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315468.html
標籤:
上一篇:如何區分陣列指標和普通指標?
