You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针反转字符串触发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,提问作者Илия Оборотов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:12:49