const變數賦值報錯分析

2021-09-06 21:12:03 字數 1139 閱讀 7385

從變數到常量的賦值是合法c++的語法約定的,

如從char 到const char順暢;

但從char **到 const char **編譯器就會報錯:

error: invalid conversion from `char**' to `const char**'
示例:

int main(int argc, char *argv)

原因:

const char** b3 說明 b3的指標可以變更,可以再指向另外乙個位址;

b3和a3都是unqualified的,但b3指向的物件型別為pointer to const char,

a3指向的物件型別為 pointer to char,兩者是不相容型別,

不符合兩運算元必須指向相容型別的規定,因此賦值非法。

更詳細的解釋詳見參考資料1;

而char** const c3 = a3;正確,則是因為const限制了c3指標的位址變更,即它指向了a3,就不再能變更指向其它指標了;這就限制了指標位址變更可能發生的潛在問題;

當然這時候,使用乙個強制型別轉換,可以解決這個編譯錯誤:

const char** b3 = const_cast(a3); // ok
但轉換後的**再出現問題就很難排查了;

看以下示例:

class foo 

void modify()

void print() const

private:

int i;

};//演示潛在的危險

//error: invalid conversion from `foo**' to `const foo**'

/int main(int argc, char *argv)

我們定義了乙個常量的foo,常量foo方法列印出來的永遠為1;

foo**到const foo **的轉換報錯,

通過乙個強轉符讓編譯通過,

最後的x.print()的結果是2;這樣的潛在危險在正式的專案**中就很難發現;

很難會想到乙個const物件還能夠變更;

SSH報錯分析

排錯設計思路 1.配置檔案的埠號修改 2.禁用root 3.etc hosts.allow etc hosts.deny 4.iptables 5.金鑰檔案及目錄的許可權修改 1.報錯的原因 是伺服器的公鑰和自己儲存的伺服器的公鑰不一樣,所以出現登入不了的情況,我們可以通過刪除.ssh known ...

iOS 開發之編譯ffmpeg 報錯分析1

目前用的最多的是 build ffmpeg.sh 執行 build ffmpeg.sh cd 到 build ffmpeg.所在的目錄下,然後執行 build ffmpeg.sh 這個時候如果你的mac曾經安裝過多個版本的xcode 執行.build ffmpeg.sh 時可能會報錯 buildin...

兩個關於oracle監聽的報錯分析

今天部署oracle的時候出現了兩個問題,首先tnsping ok 的情況下是輸入sqlplus as sysdba 登陸資料庫報錯 error ora 12560 tns protocol adapter error 找了下網上的資料,找到可能是如下原因 1 服務監聽沒起來 2 沒有配置oracl...