C++程序使用字符指针运行时出现SIGSEGV错误的原因是什么?
C++程序SIGSEGV错误原因解析
你给出的出错代码如下:
#include<iostream> #include<cstring> using namespace std; int main(void) { char *name1, *name2; cout<<"Enter your name: "; cin>>name1; strcpy(name2, name1); cout<<"Your name is: "<<name2<<endl<<endl; return 0; }
报错核心原因
出现SIGSEGV(段错误)的根本原因是声明的两个字符指针未指向合法可写的内存空间,具体触发流程:
char *name1, *name2;仅声明了两个栈上的字符指针变量,未做初始化,指针内部存储的是随机的无效内存地址,属于野指针。- 执行
cin>>name1;时,程序尝试将用户输入的字符串写入name1指向的随机地址,该地址大概率不属于当前进程的可写内存区间,直接触发非法内存访问,抛出SIGSEGV。 - 即使第一步侥幸未崩溃,后续
strcpy(name2, name1);会尝试向name2指向的另一块随机地址写入数据,同样会触发非法访问报错。
两种修复方案的运行原理
1. 替换为字符数组char name1[20], name2[20]
声明字符数组时,编译器会直接在栈上为每个数组分配连续20字节的可写内存,数组名本身就对应这块内存的首地址,无需额外初始化即可直接存储字符串,因此可以正常运行。
2. 使用new关键字动态分配内存
char *name1=new char[20]、char *name2=new char[20]会在堆区申请对应大小的可写内存,将内存首地址赋值给指针变量,此时指针指向合法可写空间,写入操作不会触发非法访问。
注意:动态申请的内存使用完成后需要手动调用
delete[] name1;、delete[] name2;释放,避免造成内存泄漏。
内容的提问来源于stack exchange,提问作者Ratnadip Das
相关产品推荐
相关产品推荐

