字符指针赋值失效问题求助:附C++字符串左右去空格代码
解决MyString类左右去空格方法的指针赋值失效问题
我来帮你拆解代码里的核心问题,以及对应的修复方案:
核心问题分析
- 指针参数的值传递陷阱:你函数里的
char *s是值传递,函数内部的s只是原指针的一个副本。最后执行s=s1时,修改的只是这个副本,完全不会影响外部的原指针——这就是你觉得"赋值失效"的根本原因。 - 局部数组的悬空指针问题:
rm_left_space里的char s2[size]是栈上的局部数组,函数执行完毕后这块内存会被系统回收,s1指向的就是已经失效的内存,后续访问会触发未定义行为。 - 字符串结束符缺失:
rm_right_space里用new分配了新内存,但没有手动添加'\0',导致处理后的字符串没有正确终止,会出现乱码。 - 拼写错误:你代码里的
countSpacesfro...是countSpacesfromLast的拼写错误,会导致编译失败。
修复后的代码示例
修正左去空格方法
void MyString::rm_left_space(char*& s) { // 使用指针引用,直接修改原指针 if (s == nullptr) return; int size = getSize(s); int i = 0; while (i < size && s[i] == ' ') { i++; } // 动态分配新内存,预留字符串结束符的位置 char* newStr = new char[size - i + 1]; int l = 0; for (int k = i; k < size; k++) { newStr[l++] = s[k]; } newStr[l] = '\0'; // 手动添加字符串结束符 delete[] s; // 释放原指针的动态内存(如果原内存是动态分配的) s = newStr; // 现在修改的是外部传入的原指针本身 }
修正右去空格方法
void MyString::rm_right_space(char*& s) { // 使用指针引用 if (s == nullptr) return; int size = getSize(s); int j = size - 1; int countSpacesfromLast = 0; while (j >= 0 && s[j] == ' ') { countSpacesfromLast++; j--; } int newSize = size - countSpacesfromLast; char* newStr = new char[newSize + 1]; for (int t = 0; t < newSize; t++) { newStr[t] = s[t]; } newStr[newSize] = '\0'; delete[] s; s = newStr; }
额外建议
- 如果你实现的是
MyString类,更推荐把字符串存储在类的成员变量里(比如char* m_data),这样不需要把指针作为参数传递,直接操作成员变量会更安全,也能避免指针传递的各种陷阱。 - 记得在类的析构函数里释放
m_data的内存,同时实现拷贝构造和拷贝赋值运算符(或者禁用它们),避免浅拷贝导致的内存泄漏问题。
内容的提问来源于stack exchange,提问作者Abhijeet
相关产品推荐
相关产品推荐

