调用字符串字符交换函数时触发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
相关产品推荐
相关产品推荐

