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

C++ string 與 char 數組區別:動態內存管理與安全性對比

     編輯:程式設計疑難解答

核心區別總結

特性std::stringchar[] / char*
內存管理自動動態分配/釋放固定大小或手動 malloc/free
邊界安全自動擴容,防緩衝區溢出固定長度,超長輸入導致溢出
操作便利性豐富成員函數 (+, ==, find, substr...)需 C 庫函數 (strcpy, strcmp, strlen...)
獲取長度s.length() O(1)strlen(s) O(n)
空值處理空字符串 "" 合法空指針 NULL 易崩潰

代碼對比示例

使用 std::string(推薦)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name, dessert;
    cout << "Enter your name:\n";
    getline(cin, name); // 自動處理換行、空格
    cout << "Enter your favorite dessert:\n";
    getline(cin, dessert);
    cout << "I have some delicious " << dessert 
         << " for you, " << name << ".\n";
    return 0;
}

使用 char 數組(風險較大)

#include <iostream>
using namespace std;

int main() {
    const int SIZE = 20;
    char name[SIZE], dessert[SIZE];
    cout << "Enter your name:\n";
    cin.getline(name, SIZE); // 限制讀取長度,防溢出
    cout << "Enter your favorite dessert:\n";
    cin.getline(dessert, SIZE);
    cout << "I have some delicious " << dessert 
         << " for you, " << name << ".\n";
    return 0;
}

關鍵問題解答

Q1: 兩者功能是否相同?

基本輸入輸出功能相同,但 string 更安全、靈活。char[20] 若輸入超過 19 字符(含結束符)會緩衝區溢出,導致未定義行為。

Q2: cin.getline vs getline(cin, str)?

  • cin.getline(char*, size):C 風格,讀取指定長度,遇換行停止。
  • getline(istream&, string&):C++ 風格,自動管理內存,讀取整行。
  • 效果相似,但後者無長度限制,代碼更簡潔。

Q3: 為什麼不建議 char* 接收輸入?

// 危險示例
char *name = new char[20];
cin >> name; // 若輸入超過 19 字符,堆內存溢出,程序崩潰或被攻擊

最佳實踐建議

  1. 優先使用 std::string:現代 C++ 標準庫核心組件,性能優化良好(SSO 小字符串優化)。
  2. 僅在與 C API 交互時用 char*:調用 c_str() 或 data() 獲取只讀指針。
  3. 避免手動內存管理:不再需要 new char[]、strcpy、strlen 等易錯操作。

參考資源

C++ 參考權威站:std::string::getline

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved