<p>应声明为 const char* 数组存储字符串字面量,因字面量存于只读段,非 const 声明导致运行时修改引发未定义行为;需修改内容时应分配可写内存;访问时须计算元素个数防止越界。</p>

指针数组声明时容易漏掉 const 修饰符
直接用 char* 数组存字符串字面量,编译可能通过,但运行时修改会触发未定义行为。因为字符串字面量存储在只读段,char* p = "hello" 实际上让指针指向不可写内存。
- 正确做法是声明为
const char*数组:const char* strs[] = {"apple", "banana", "cherry"}; - 如果后续需要修改内容,必须分配可写内存(比如用
new char[20]或std::vector<char></char>),不能直接赋值字面量 - g++ 默认允许
char* p = "xxx"(为兼容旧代码),但启用-Wwrite-strings会警告;Clang 更严格,默认报错
访问指针数组元素时下标越界不报错但很危险
C++ 不做运行时数组边界检查,strs[i] 中 i 超出实际长度(如 sizeof(strs)/sizeof(strs[0]))会导致读到随机内存,可能崩溃或输出乱码。
- 务必先计算元素个数:
int n = sizeof(strs) / sizeof(strs[0]);
- 循环中用
for (int i = 0; i ,别硬写 <code>for (int i = 0; i —— 数组大小一变就失效 - 若数组是函数参数传入,
sizeof失效(退化为指针),此时必须额外传长度,或改用std::array/std::vector
用指针数组实现字符串排序要小心交换的是指针不是内容
对 const char* 数组排序时,交换的是指针地址本身,不是字符串内容。这没问题,也高效;但新手常误以为在“移动字符串”,结果发现原字符串没变、只是顺序变了。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 标准库排序示例:
std::sort(strs, strs + n, [](const char* a, const char* b) { return std::strcmp(a, b) < 0; }); -
std::strcmp是必需的 —— 不能直接用a 比较指针值,那比的是地址大小,不是字典序 - 如果想按长度排序:
return std::strlen(a) - 注意:排序后
strs[0]指向原来某个字符串的首地址,不是新分配的内存
混用指针数组和 std::string 容易引发生命周期问题
把局部 std::string 的 c_str() 存进指针数组,函数返回后指针就悬空 —— 因为 std::string 析构,内部缓冲区释放,c_str() 返回的指针失效。
立即学习“C++免费学习笔记(深入)”;
- 错误示范:
const char* bad_arr[2];<br>{<br> std::string s1 = "temp";<br> bad_arr[0] = s1.c_str(); // 悬空指针<br>} - 安全做法:全用
std::string,或确保字符串生命周期长于指针数组;若必须用 C 风格,用strdup(记得free)或静态/全局存储 - 现代 C++ 推荐直接用
std::vector<:string></:string>,避免手动管理指针和生命周期
C++ 里指针数组处理字符串的关键不在语法多难,而在时刻意识到:你操作的是地址,不是数据本身;你依赖的是程序员对内存布局和生命周期的理解,而不是语言自动兜底。

















