使用指针反转字符串触发SIGSEGV段错误,求助排查(Win10+CodeBlocks+GDB)
Segmentation Fault When Reversing String with Pointers (Windows 10, CodeBlocks + GDB)
这个段错误(SIGSEGV)的问题其实很好定位——你在尝试修改字符串字面量,而C语言里字符串字面量是被存储在只读内存区域的,绝对不允许写入操作。
错误根源
看你main函数里的这行代码:
char* s1 = "1234";
这里的"1234"是字符串字面量,编译器会把它放到程序的只读数据段(比如.rodata段)。当你的myreverse函数执行到*s = *end;时,本质是试图往只读内存地址里写数据,操作系统为了保护内存安全,直接触发了段错误来终止程序。
解决方法
你只需要把字符串放到可写的内存区域就行,有两种常用方案:
方案1:使用栈上的字符数组(最简单)
把字符串字面量复制到栈上的可写数组中,修改main函数如下:
int main() { char s1[] = "1234"; // 栈上分配可写数组,自动复制字面量内容 myreverse(s1); printf("%s", s1); return 0; }
这里char s1[] = "1234";会在栈上分配5个字节的空间(4个字符+末尾的'\0'),并把"1234"的内容复制进去,这个数组是完全可写的,反转操作就能正常执行。
方案2:使用堆内存(适合动态长度场景)
如果你的字符串长度不确定,或者需要长期保存,可以在堆上分配内存:
#include <stdlib.h> // 引入malloc/free的头文件 int main() { // strdup会自动分配堆内存并复制字符串 char* s1 = strdup("1234"); if (s1 == NULL) { fprintf(stderr, "Failed to allocate memory\n"); return 1; } myreverse(s1); printf("%s", s1); free(s1); // 用完记得释放堆内存,避免泄漏 return 0; }
如果你的Windows环境下编译器不支持strdup(它是POSIX标准函数),可以手动用malloc+strcpy实现:
char* s1 = malloc(strlen("1234") + 1); if (s1 != NULL) { strcpy(s1, "1234"); }
补充说明
你的myreverse函数逻辑本身是正确的,只要传入的是指向可写内存的字符指针,它就能正常完成反转工作。
内容的提问来源于stack exchange,提问作者Илия Оборотов
相关产品推荐
相关产品推荐

