在c ++中使用cin时内存损坏

Mat*_*usz 1 c++ header-files clion

我上课了"student.cpp"

#include <iostream>
#include "student.h"
using namespace std;


void student::setMarks(int m1, int m2) {
    mark1 = m1;
    mark2 = m2;
};
void student::setName(char *n) {
    name = n;
};
int student::calc_media(void){
    return (mark1+mark2)/2;
};
void student::disp(void){
    cout << "Student:" << name << " \n media:"<< calc_media() <<"\n";
};

student::student(){
   mark1 = 0;
   mark2 =0;
   name = "";
};
Run Code Online (Sandbox Code Playgroud)

头文件"student.h":

ifndef CLASY_STUDENT_H
#define CLASY_STUDENT_H

#endif //CLASY_STUDENT_H

class student{

    char *name;
    int mark1, mark2;

public:
    void setName(char *n);
    void setMarks(int m1, int m2);
    void disp(void);
    int calc_media(void);
    student();
};
Run Code Online (Sandbox Code Playgroud)

和"main.cpp":

#include <iostream>
#include "student.h"

using namespace std;

int main() {
    student s;
    char* n;
    int m1, m2;

    cout << "Enter name:";
    cin>> n;
    cout << "Enter marks of two subjects:";
    cin>> m1;
    cin>> m2;

    s.setName(n);
    s.setMarks(m1, m2);

    s.disp();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在运行这个美国Clion和Cmake是:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")

set(SOURCE_FILES main.cpp student.cpp student.h student.cpp student.h)
Run Code Online (Sandbox Code Playgroud)

但是当我运行时,它会询问名称,但是当我输入内容时,我会遇到内存碎片错误.怎么了?那么有人可以告诉我它是否适合C++?我正在尝试从java切换到c ++.

BoB*_*ish 6

char* n;
...
cin>> n;
Run Code Online (Sandbox Code Playgroud)

n是指针,应该指向特定的记忆.但你永远不会设置它.因此它有一些未定义的值,指向谁知道哪里到你最终试图覆盖的某些内存中.很可能内存不允许覆盖,导致段错误.

不要尝试使用char*,如果你还不知道有关手动内存管理(一旦你这样做,你就会明白为什么不).使用std::string.

从快速浏览一下,你几乎可以char*随处取代std::string(只要你#include <string>).