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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:04