c++指向其成员是指针的结构的指针

标签 c++

大家好,我正在做一项作业,当给定一个结构及其成员时,我将不得不使用动态内存分配来初始化成员。这是我使用的代码:

# include <iostream>
# include <string>

using namespace std;

结构

struct Student
{
char * name;
float gpa;
} ;

原型(prototype)

Student *  createStudent(char name[], float gpa);

int main ()
{
 int length ;
 float gpa ;
 char *p;
 Student *myPointer ;
 Student myStudent ;
 myPointer = &myStudent;

 cout << " Please enter number of characters you want to enter " << endl;
 cin >> length ;
 length = length + 1;
 p= new char [length +1];
 cout << " Please enter name " << endl;
 cin >> p ;
 cout << " please enter gpa "<< endl;
 cin >> gpa ;
 myPointer = createStudent (p,gpa);
 cout << myPointer->gpa;
 cout << (*myPointer).name << endl;

这是打印名称时的错误,但是当我在打印之前看到名称的值时,它显示的与用户输入的值相同:

  delete[]p;
  p = 0;
  system("pause");
  return 0;
 }

此函数创建一个学生对象并将传递给学生对象的姓名和成绩分配给学生对象,并返回学生对象的指针:

Student *  createStudent( char name[], float gpa )
{

Student *studentPtr ;
Student studentObject;
studentPtr = &studentObject;
studentPtr-> name = name;
studentPtr-> gpa = gpa ;
return studentPtr ;
}

谁能告诉我为什么这个名字没有打印出来。提前谢谢你。

最佳答案

studentObject 分配在堆栈上,即它具有自动存储持续时间,这意味着它会在函数返回时被销毁。指针不会使其保持事件状态。

这意味着 myPointer 是一个悬挂指针;取消引用它 (myPointer->) 会调用未定义的行为。


要更正它,只需按值返回对象:

Student createStudent(char name[], float gpa)
{
    Student studentObject;
    studentPtr.name = name;
    studentPtr.gpa = gpa;
    return studentObject;
}

Student myStudent = createStudent(p, gpa);

编辑:我刚刚读到您需要使用动态内存分配来初始化成员。上面的解决方案不这样做。对于动态内存分配,您必须使用 new:

Student* createStudent(char name[], float gpa)
{
    Student* studentPtr = new Student;
    studentPtr->name = name;
    studentPtr->gpa = gpa;
    return studentPtr;
}

myPointer = createStudent(p, gpa);
// use
delete myPointer;

newstudentPtr->name 分配一个新缓冲区可能是个好主意,而不是仅仅分配指针;您可以查看 Mateusz 对此的回答。

当然,这只是您教授的一个坏例子。正如 gd1 所提到的,这种代码不是好的现代 C++,不应该出现在真正的生产代码中。

关于c++指向其成员是指针的结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31684634/

相关文章:

c++ - 从计算机向计算机发送 XML 数据 - Qt

c++ - 为什么 cv::meanStdDev 函数在调试时失败并出现异常

c++ - vector 中的位置值

c++ - 如何在 C++ 中选择多维数组中的范围?

c++ - 在 OpenMP 中加入数组结果

c++ - wxwidget wxRichTextCtrl编译结果在ld : symbol(s) not found

c++ - 什么东西便宜 : cast to int or Trim the strings in C++?

c++ - 如何将 Action 连接到 C++/Qt 中的值更改

c++ - cpp中 "[=]"是什么意思

c++ - 在 Visual Studio 2010 中编译单个 C++ 文件