首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 字符指針輸出地址而非字串:cout 對 char* 的特殊處理

     編輯:程式設計疑難解答

現象

`char *p = "hello"; cout << p;` 輸出 `hello` 正常。但若 `char *p; cin >> p; cout << p;` 輸出記憶體地址(如 `0x7ffe...`)。

原因

`operator<<` 對 `char*` 有特化重載,視為 C 風格字串,輸出內容而非地址——前提是指針指向以 `\0` 結尾的有效字串。

  • `cin >> p` 要求 `p` 指向**已分配、足夠大的緩衝區**;若 `p` 未初始化(野指針),行為未定義,可能寫入隨機地址、導致崩潰或輸出亂碼/地址。
  • 若 `p` 指向的記憶體**沒有 `\0` 結尾**,`cout` 會持續讀取直到遇到 `\0`,可能輸出垃圾資料或地址般的亂碼。

正確用法

// 1. 使用字元陣列(棧上分配,自動管理)
char buf[100];
cin >> buf;        // 自動加 \0,防溢出建議用 cin.getline(buf, 100)
cout << buf;       // 輸出字串內容

// 2. 動態分配
char *p = new char[100];
cin >> p;
cout << p;
delete[] p;

// 3. 現代 C++:std::string(推薦)
std::string s;
cin >> s;          // 或 getline(cin, s)
cout << s;

補充

  • 若必須輸出指針地址:`cout << static_cast(p);` 或 `cout << (void*)p;`。
  • `cin >> p` 不做邊界檢查,**極易緩衝區溢出**,嚴禁用於生產代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved