我目前遇到分段错误的问题:我的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
答案 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 作为函数中的对象引用后使用上述语句。休息看起来很好,它对我有用,希望它也适合你。