【问题标题】:SIGSEGV error in C++ with character pointer [closed]带有字符指针的 C++ 中的 SIGSEGV 错误
【发布时间】:2021-11-24 11:20:48
【问题描述】:

为什么我在这个程序中收到 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;
}

请向我解释为什么我收到 SIGSEGC 错误。此程序显示字符指针 (char *name1, *name2) 错误,但适用于字符数组 (char name1[20], name2[20]) 以及动态内存分配器 new (char *name1=new char[20] 和 char *name2=new char[20])

【问题讨论】:

    标签: c++ pointers segmentation-fault c-strings


    【解决方案1】:

    您的程序出现段错误,因为您没有为name1name2 分配内存。您的程序正在将来自 cin 的输入写入一个未定义的内存位置,这会导致它与 SIGSEGV 一起崩溃。

    【讨论】:

    • 我知道了...非常感谢。
    【解决方案2】:

    这些声明的变量

    char *name1, *name2;
    

    未初始化且具有不确定的值。

    因此这些陈述

    cin>>name1;
    strcpy(name2, name1);
    

    调用未定义的行为。

    使用标准类 std::string 的对象。例如

    #include <string>
    
    //...
    
    std::string name1, name2;
    //...
    cin>>name1;
    name2 = name1;
    //...
    

    否则你需要声明字符数组,例如like

    const size_t N = 100;
    char name1[N], name2[N];
    

    然后写

    cin.getline( name1, sizeof( name1 ) );
    strcpy(name2, name1);
    

    【讨论】:

    • 好的...现在我知道了...非常感谢。
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2015-03-14
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多