我在struct中输入字符串指针时遇到问题。这是我的代码:
typedef struct{
char *name;
int age;
}stu;
void allocate(stu* &s, int n){
s = (stu*) malloc(n * sizeof(stu));
if(s == NULL){
printf("\nNot enought memory!");
exit(1);
}
}
// Input info
void input_info(stu* &s, int n){
void input(stu &s); //prototype
for(int i = 0; i < n; i++){
printf("\n-- Student #%d:", i+1);
input(*(s+i));
}
}
void input(stu &s){
fflush(stdin);
printf("\nEnter student's name: ");
gets(s.name);
printf("\nEnter student's age: ");
scanf("%d", &s.age);
}
// End input
//Output info
void output_info(stu* s, int n){
void output(stu s); //prototype
for(int i = 0; i < n; i++){
printf("\n-- Student #%d:", i+1);
output(*(s+i));
}
}
void output(stu s){
printf("\nName: %s", s.name);
printf("\nAge: %d", s.age);
}
//End output
int main(){
stu* s;
int n;
printf("How many students you want to input?: ");
scanf("%d", &n);
allocate(s, n);
input_info(s, n);
output_info(s, n);
getch();
}
当我输入第二个学生的名字时,它被打破了?我分配了内存。我想问一下如何为stu指针释放内存?感谢您的阅读
答案 0 :(得分:4)
在您的计划中可以并且应该改进许多事情。一些建议:
char *
成员,将其替换为std::string
。 You don't want to do manual memory management for anything unless you really want to. scanf
和printf
,它们不是类型安全。 Since you are using C++ use std::cin
and std::cout
and you are much safer than usage with later。fflush(stdin)
,在fflush
gives you undefined behavior以外的任何地方拨打stdout
。new
而不是malloc
。 Avoid using dynamic memory allocation at all, if you can。更喜欢使用std::vector
。 <强> Online Sample 强>:
根据上述建议,您的示例可以写成:
#include<string>
#include<vector>
#include<iostream>
typedef struct
{
std::string name;
int age;
}student;
// Input info
void input_info(std::vector<student> &s)
{
student obj;
std::cout<<"\nEnter Students name";
std::cin>>obj.name;
std::cout<<"\nEnter Students age";
std::cin>>obj.age;
s.push_back(obj);
}
// Output info
void output_info(const std::vector<student> &s)
{
for (auto itr = s.cbegin(); itr != s.cend(); ++itr)
{
std::cout<<"\nName:"<< itr->name;
std::cout<<"\nAge:"<< itr->age;
}
}
int main()
{
int n;
std::cout<<"How many students you want to input?\n";
std::cin>>n;
std::vector<student>s;
for(int i = 0; i<n; i++)
{
input_info(s);
}
output_info(s);
return 0;
}
答案 1 :(得分:0)
正如之前的一些海报所提到的,代码不是“纯粹的”c ++,因为它混合了许多C和C ++特性。我个人认为在处理像你这样的POD结构时问题就少了。
崩溃可能是由gets()引起的。它假定char指针已经分配了合适的容量。当输入字符串长于容量时,它具有未定义的行为。你的容量为0,因此崩溃。
如果您坚持使用C函数,请参阅:Safe Alternative to gets。 否则查找getline()。