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

C++ _itoa_s 使用指針參數報錯?指針未分配內存導致訪問違規

     編輯:程式設計綜合問答

錯誤代碼

int _int = 192;
char * _char;           // 未初始化,野指針
_itoa_s(_int, _char, 10); // 崩潰:寫入隨機地址

根本原因

_itoa_s 第二參數需指向已分配、足夠大小的字符緩衝區。野指針指向隨機地址,寫入導致訪問違規。

修正方案

// 方案一:棧上數組(推薦,自動釋放)
char buffer[20];
_itoa_s(_int, buffer, 10); // 或 _itoa_s(_int, buffer, sizeof(buffer), 10)

// 方案二:堆上分配(需手動釋放)
char *buffer = (char*)malloc(20 * sizeof(char));
if (buffer) {
    _itoa_s(_int, buffer, 20, 10);
    // 使用 buffer
    free(buffer);
}

// 方案三:C++ string + c_str (不可直接用,需轉換)
std::string str = std::to_string(_int); // 現代 C++ 首選

關鍵參數說明

errno_t _itoa_s(
    int value,           // 待轉換整數
    char *buffer,        // 目標緩衝區(必須有效)
    size_t sizeInChars,  // 緩衝區字符容量(含結束符)
    int radix            // 進制基數 (2, 8, 10, 16)
);

現代 C++ 替代方案

  • std::to_string(int) —— 返回 std::string,無緩衝區管理煩惱。
  • std::ostringstream —— 格式化控制更靈活。
  • fmt::format("{}", value) (C++20 std::format) —— 高性能、類型安全。

避坑清單

  • 指針使用前必須分配內存(棧數組、malloc/new、vector/string 內部緩衝區)。
  • sizeInChars 必須 ≥ 所需字符數+1,否則返回 ERANGE 且緩衝區不變。
  • 基數 radix 僅支持 2/8/10/16,其他值報 EINVAL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved