聽說這裡高手多,問一個 C++ 的問題 (電腦版無人回應)

在電腦版問過了,但沒人回應我 , 可能沒有人知道吧.
-----------------------
主題 : C++ 的 Debug ' Release 模式對 string 的處理不同 ?
-----------------------

以下的示例我知道這是不正確的用法, 但我有點鑽牛角尖, 請見諒.
最佳化已關閉 /Od

string 物件配上 sprintf (), 要正確的顯示 'abc' :

Debug ' Release 模式下, 皆可以這麼寫:

  string s("abc");
  printf("%s", s.data());

但在 Release 模式下除了上述寫法, 亦可這麼寫 :
(Debug 模式下這麼寫出來的結果一定是錯的)

  string s("abc");
  printf("%s", &s);

我發現原因在於 Debug 模式下, s 多了紅框的東西 , 接著才是 'abc'
聽說這裡高手多,問一個 C++ 的問題 (電腦版無人回應)
所以在 Debug 模式下我必須寫成這樣 :
  string s("abc");
  printf( "%s", (size_t *)(&s)+1 );

而 Release 模式下, s 就直接是 'abc' :
有人知道為什麼嗎 ? 謝謝
感恩
2021-07-24 4:18 發佈
閒聊與趣味 版,當然沒有辦法打字說什麼 ...
宣告規則 ... 啦 ...
輸出規範 ... 啦 ...
錯誤碼查詢 ... 啦 ...
叭啦叭啦 達啦哩達啦 ( 誤 )

閒聊與趣味 版,當然只能這麼打字 - -
... ...
您說的話〔電腦〕聽不懂的時候,
〔電腦〕沒直接 甩頭就走 已經很不錯了好嗎

〔電腦〕語言學成功的話,來發明一個 會 甩頭就走 的 〔電腦〕 好了
行至水窮處,與人云亦云。〔薪水是零元,還活得下去〕。
jimmypp
jimmypp 樓主

不懂您的意思

2021-07-24 4:53
水云

也就是說,中文,比〔電腦〕語言難很多。[安慰]

2021-07-24 4:55
jimmypp wrote:
有人知道為什麼嗎 ?


#include <stdio.h>

int main(void)
{
printf("Sorry, that isn’t my strong suit.!\n");
return 0;
}
</stdio.h>
jimmypp wrote:
而 Release 模式下, s 就直接是 'abc' :
有人知道為什麼嗎 ? 謝謝


s.data() 是取得 s 這個字串物件的文字內容位置

&s 是取得 s 這個字串的物件位置

如果在 std::string 這個類別中,有定義了其它成員變數在文字內容前面,那你取得物件位置就不會等同於文字內容的位置

猜測在 debug 模式下,string 類別除了文字內容,還有其它的成員變數,所以你用 &s 時,會看到那個成員的值
bernie_w39 wrote:
猜測在 debug 模式下,string 類別除了文字內容,還有其它的成員變數,所以你用 &s 時,會看到那個成員的值


目前您是符合答案的, 謝謝您
但還是沒解開我的疑問
jimmypp wrote:
但還是沒解開我的疑問


疑問是什麼?
jimmypp
jimmypp 樓主

假設我非常依賴指標(如果我是個底層的 debugger)

2021-07-24 10:15
C++沒玩過
以C來說

String 本身就是個 pointer

string s("abc");
  printf("%s", &s);

printf() 不應用 &s

試試這個

string s("abc");
  printf("%s", s);
jimmypp wrote:
假設我非常依賴指標(如果我是個底層的 debugger)


這和依賴指標沒關係吧

每個語法都有它的意義,&s 取得的就是 string 物件的位置

除非文件中有明確定義,string 類別中的第一個成員,就必需是字串中的文字,否則你這樣寫,就不能保証會取到文字內容

更何況即便你弄明白了在你目前環境下,debug 模式多了什麼成員變數,未來移到別的開發環境,程式一樣有可能出錯
jimmypp
jimmypp 樓主

我明白您的意思, 我太鑽牛角尖了, 謝謝您.

2021-07-24 10:32
jimmypp wrote:
但在 Release 模式下除了上述寫法, 亦可這麼寫 :
(Debug 模式下這麼寫出來的結果一定是錯的)
  string s("abc");
  printf("%s", &s);

(恕刪)


Release可以是運氣好,不代表是正確的
輸出錯誤是因為你用錯方法,而起因是你沒理解&所代表的意義
&s的含意4樓已說明,不再贅述

C++最主要就是把數據封裝保護起來,不給外部去隨意存取
只能透過物件的成員函式,而你想直接用&去取內部的變數,當然是錯的
若你非得要用簡易的方式去輸出,那就重新定義運算子 & , char * ...之類
但是建議不要這麼玩,自已一個人作的程式無所謂
若會有其他人共同維護,就不要搞一套會讓人混淆的語法出來
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?