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

调用字符串字符交换函数时触发Segmentation Fault问题排查

问题分析与修复方案

你的代码触发段错误的核心原因是未初始化的野指针:在swapchars函数中,char *ptr;声明后没有被赋予任何有效内存地址,它指向的是内存中的随机区域。当执行*ptr= *(L+i);时,你试图向这块不确定的内存写入数据,而这块内存大概率属于进程无权访问的区域,直接引发Segmentation Fault。

至于把循环逻辑放到main里看似正常,这只是偶然的运气——main函数栈上的未初始化变量可能刚好指向了当前进程可访问的内存,但这种行为属于未定义行为,随时可能崩溃或出现异常结果,本质上代码依然是错误的。

修复方案

最直接的修复是放弃使用指针,改用普通字符变量作为临时存储(更高效也更安全):

#include <stdio.h>
void swapchars(int Q,char* L){
    char temp;
    for(int i=0;i<Q-1;i+=2){
        temp= *(L+i);
        *(L+i)= *(L+i+1);
        *(L+i+1)= temp;
    }
}
int main() {
    int N;
    scanf("%d",&N);
    char str[N+1];
    scanf("%s",str);
    swapchars(N,str);
    printf("%s",str);
    return 0;
}

如果一定要使用指针,必须确保它指向有效内存,比如指向一个局部变量的地址:

void swapchars(int Q,char* L){
    char temp;
    char *ptr = &temp; // 初始化指针指向有效内存
    for(int i=0;i<Q-1;i+=2){
        *ptr= *(L+i);
        *(L+i)= *(L+i+1);
        *(L+i+1)= *ptr;
    }
}

内容的提问来源于stack exchange,提问作者Arwa Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:10:25