2

我在 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指针释放内存?谢谢阅读

4

2 回答 2

4

在你的程序中有很多可以而且应该改进的地方。一些建议:

  1. 删除char *成员替换它std::string除非你真的想要,否则你不想对任何东西进行手动内存管理。
  2. 放弃愚蠢的scanfprintf它们不是类型安全的。由于您使用的是 C++ 使用std::cinandstd::cout并且您比使用 later 更安全
  3. 放弃fflush(stdin), 调用fflush任何东西,而不是stdout 给你未定义的行为
  4. 在 C++ 中,您通常希望使用new而不是malloc. 如果可以的话,完全避免使用动态内存分配。更喜欢使用 astd::vector代替。

在线示例
按照上述建议,您的示例可以写成:

#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;        
}
于 2013-03-31T13:13:16.407 回答
0

正如之前的一些海报所提到的,代码不是“纯”c++,因为它混合了很多 C 和 C++ 特性。就我个人而言,我认为在处理像您这样的 POD 结构时问题较少。

崩溃很可能是由gets() 引起的。它假定 char 指针已经分配了合适的容量。当输入字符串长于容量时,它具有未定义的行为。您的容量为 0,因此崩溃。

如果您坚持使用 C 函数,请参阅:Safe Alternative to gets。否则查找getline()。

于 2013-03-31T13:24:41.303 回答