C语言移除字符串指定位置及末尾字符时触发Segment Fault问题求助
问题原因
你触发段错误的核心原因是试图修改字符串常量。
"FROM:<oliverb@hotmail.com>"是字符串字面量,在C语言中它会被存储到程序的只读数据段(.rodata),这块内存不允许写入操作。你通过strchr得到的指针指向的是这个只读区域的内存,后续执行stripFrontBac[strlen(stripFrontBac) - 1] = '\0'时,试图往只读内存写数据,直接触发了内存访问错误(Segment Fault)。
解决方案
要解决这个问题,你需要先把字符串常量复制到一块可修改的内存区域,比如栈上的字符数组,或者用malloc动态分配的堆内存,再进行后续的修改操作。
方法1:使用栈上的字符数组
#include <stdio.h> #include <string.h> int main() { // 把字符串常量复制到可修改的字符数组中 char str[] = "FROM:<oliverb@hotmail.com>"; const char c = '<'; char *ret = strchr(str, c); char *stripFrontBac = ret; printf("value of ret %s\n", stripFrontBac); // 移除首字符(<) stripFrontBac++; printf("value of ret %s\n", stripFrontBac); // 移除末尾的>符号 size_t len = strlen(stripFrontBac); if (len > 0) { stripFrontBac[len - 1] = '\0'; } printf("最终结果: %s\n", stripFrontBac); printf("最终长度: %ld\n", strlen(stripFrontBac)); return 0; }
方法2:使用动态分配的堆内存
如果字符串长度不确定,或者需要在函数间传递,推荐用malloc分配内存:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { const char *orig_str = "FROM:<oliverb@hotmail.com>"; // 分配足够的内存(+1是为了存储终止符'\0') char *str = malloc(strlen(orig_str) + 1); if (str == NULL) { perror("malloc failed"); return 1; } strcpy(str, orig_str); const char c = '<'; char *ret = strchr(str, c); char *stripFrontBac = ret; printf("value of ret %s\n", stripFrontBac); stripFrontBac++; printf("value of ret %s\n", stripFrontBac); size_t len = strlen(stripFrontBac); if (len > 0) { stripFrontBac[len - 1] = '\0'; } printf("最终结果: %s\n", stripFrontBac); printf("最终长度: %ld\n", strlen(stripFrontBac)); // 记得释放动态分配的内存 free(str); return 0; }
额外说明
- 字符串字面量在C中本质是
const char[]类型,虽然编译器允许用char*指向它,但这只是历史兼容写法,内存仍然是只读的,修改它属于未定义行为。 - 操作字符串前一定要确认目标内存是否可写,避免直接修改字符串常量。
内容的提问来源于stack exchange,提问作者john_w
相关产品推荐
相关产品推荐

