大家好,我正在做一项作业,当给定一个结构及其成员时,我将不得不使用动态内存分配来初始化成员。这是我使用的代码:
# 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;
用 new
为 studentPtr->name
分配一个新缓冲区可能是个好主意,而不是仅仅分配指针;您可以查看 Mateusz 对此的回答。
当然,这只是您教授的一个坏例子。正如 gd1 所提到的,这种代码不是好的现代 C++,不应该出现在真正的生产代码中。
关于c++指向其成员是指针的结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31684634/