C语言移除字符串逗号代码对char*定义字符串表现异常问题
问题根本原因
这个问题的核心是C语言中两种字符串初始化方式的内存属性差异:
char str[] = "xxx"定义的是栈上的可写字符数组:程序会把只读存储区的字符串字面量完整拷贝到栈空间的数组内,对这块内存的读写操作都是合法的。char *str = "xxx"定义的是指向只读存储区的指针:字符串字面量本身存放在程序的.rodata(只读数据段),操作系统会对这块内存做写保护,任何修改操作都会触发段错误(Segmentation Fault)。
当你调用removeCommasInString(str3)时,函数内的*w++ = *r语句尝试修改只读数据段的内容,直接触发段错误,操作系统当场终止你的进程,所以:
- 调用
removeCommasInString(str3)之后的printf和puts语句根本没有机会执行 - 部分运行环境不会显式输出段错误提示,只会显示进程异常退出,你看到的"exit code 0"大概率是运行环境的显示误差,实际段错误的退出码通常为139。
修复方案
如果要处理str3指向的字符串,需要保证传入函数的内存是可写的,两种常用方式:
- 直接改成数组定义,和str、str2保持一致:
char str3[] = "1,000";
- 手动分配可写内存,拷贝字符串内容后再处理:
char* str3 = malloc(6); // "1,000"含结束符共6字节 strcpy(str3, "1,000"); // 使用完后记得free(str3)避免内存泄漏
内容的提问来源于stack exchange,提问作者RobK
相关产品推荐
相关产品推荐

