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

为何这段C++代码会出现Segment Fault(段错误)?

为何第一段代码出现段错误,第二段却正常运行?

第一段代码的问题

int main(int argc,char *argv[]){
    int *role;
    sscanf(argv[1],"%d",role);

    return 0;
}

这里的int *role;仅声明了指针变量,但未给它分配有效内存地址,此时它是「野指针」——指向内存中随机的某个位置,这个位置可能属于操作系统、其他程序,或是当前程序的只读区域。

sscanf的第三个参数需要可写入数据的有效内存地址,传入野指针后,sscanf会尝试往随机地址写数据,直接触发内存访问违规,也就是Segment Fault(段错误)。

另外这段代码还有额外风险:如果启动程序时未传入命令行参数,argv[1]为NULL,访问它也会直接崩溃。

第二段代码能正常运行的原因

int main(int argc,char *argv[]){
    int *role = new int;
    sscanf(argv[1],"%d",role);

    return 0;
}

这里用new int在堆上分配了一块可存储int类型数据的内存,且将该内存地址赋值给role指针。此时role指向的是当前程序合法拥有的可写内存区域,sscanf可以安全地把解析出的整数写入该地址,因此不会触发段错误。

不过这段代码存在内存泄漏问题:分配的堆内存未用delete释放,会造成内存浪费,但这不会导致运行时崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:34:54