为何这段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
相关产品推荐
相关产品推荐

