为什么我会收到Segmentation错误:我的C ++程序中有11个错误?

时间:2015-05-15 18:10:12

标签: c++

我目前遇到分段错误的问题:我的C ++程序中有11个使用面向对象的概念:

//
//  main.cpp
//  pointersInOOP
//
//  Created by Jayant Raul Rao on 15/05/15.
//  Copyright (c) 2015 Jayant Raul Rao. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstdlib> 

using namespace std;

class Student
{
public:

    char * name;
    int semesterHours;
    float gpa;
};



int main(int argc, const char * argv[]) {

    cout<<"Beta Version of 1.0 Student constructor. \n";
    cout<<"\n";
    cout<<"\n";

    //Declaring a student object and a pointer
    Student s;
    Student *pOnS = &s;

    //take userInput
    printf("Please name the student... : ");
    cin>>pOnS->name;

    printf("Okay, you called your Student %s. Please now input the gpa of the Student:  ", pOnS->name);
    cin>>pOnS->name;
    printf("The gpa of %s is %f", pOnS->name, pOnS->gpa);

    return 0;
}

当我执行此代码时,我实际上给出了我的输入,并且始终以分段错误结束。如果我在终端中执行,我会得到这个错误。如果我直接在Xcode中执行,我会被定向到一个名为istream的文件,其中有一行写入:错误访问0x1。因此我无法执行我的程序。我已经发现了Segmentation故障的含义。 类似Stack Overflow的东西。但我无法真正理解任何错误修正。

我提前感谢你,

Jayant Raul Rao

4 个答案:

答案 0 :(得分:0)

此代码未经过测试,但重点是如果您为学生姓名使用字符串类型会更容易。因此,如果您将char *name更改为std::string name,您的代码就可以运行。

如果你想坚持使用char那么你必须做这样的事情。

#include <string>

...   

//take userInput
printf("Please name the student... : ");
std::string name;
cin>>name;
pOnS->name = new char(name.size() + 1);
strncpy(pOnS->name, name.c_str(), name.size());
pOnS->name[name.size() + 1] = '\0';

P.S解决了这个问题:

printf("Okay, you called your Student %s. Please now input the gpa of the Student:  ", pOnS->name.c_str()); <-- if using String type
cin>>pOnS->gpa; //<----

答案 1 :(得分:0)

  class Student
{
  public:
  char * name; //you are not allocating memory for this.
  int semesterHours;
  float gpa;
};

您可以使用char name[15]std::string等字符数组 另外,在打印之前,您没有初始化gpa

答案 2 :(得分:0)

分段错误表示某种无效的内存访问。在这种情况下,您将声明一个指针(char * name),但从不初始化它。所以它指向一些任意值,它可能是也可能不是有效的内存地址。然后你试着写一遍:cin>>pOnS->name;。这是未定义的行为,可能会导致以下情况之一:

  • 如果指针的值不是有效的可写内存地址,那么你马上就会崩溃;你得到的错误取决于操作系统,但最常见的是“分段故障”,“一般保护故障”或“总线错误”。

  • 如果指针的值是有效的可写内存地址,那么你将覆盖那里发生的任何事情。这似乎可以正常工作,只是当您尝试在不同的计算机上或在不同的时间运行程序时,它会无法预测地崩溃。或者它可能会损坏您的程序稍后会尝试使用的内容,从而导致无关代码崩溃。

要避免此问题,请确保始终写入有效的内存位置。在这种情况下,最简单的方法是使用std::string而不是原始字符数组。

此外,我认为您对pOnS->name的第二次写入实际上应该是pOnS->gpa

答案 3 :(得分:-1)

  

pons =新学生;

在声明 pons 作为函数中的对象引用后使用上述语句。休息看起来很好,它对我有用,希望它也适合你。