0

我有一个包含string字段的结构。我创建了一个由这些结构组成的数组,然后我想将它们传递给一个函数(通过引用)。当我注释掉该string字段时,一切正常,但如果我不这样做,程序就会崩溃。我在任何地方都找不到答案..

这是代码(我将其简化为仅显示问题):

struct student {
    int a;
    int b;
    string name[20];
    char status;
};

void operation(student the_arr[1],int number_of_students) {
    delete[] the_arr;
    the_arr = new student[3];
    for(int i = 0; i<3; i++) {
        the_arr[i].a = i+5;
        the_arr[i].b = i+4;
    }   
}

int main() {    
    student *abc;
    abc = new student[0];
    operation(abc, 0);  
    system("pause");
    return 0;
}

我需要数组是动态的,所以我可以在需要时更改它的大小。

4

2 回答 2

1

假设您不能使用std::vector而不是动态分配的数组,请遵循以下答案。在任何其他情况下,您都应该使用标准库提供的容器。

注意:您的程序不会崩溃。编译器唯一会抱怨它的allocating zero elements部分,但会让你编译和运行这个程序。

你的功能是完全错误的。使用动态分配时,您可以像这样简单地传递一个指针:

void operation(student* the_arr, int number_of_students) {

然后在您的函数内部,您将动态分配存储在指针内的内存,该the_arr指针不是通过引用传递的,因此会导致创建一个本地指针变量,该变量在执行后将丢失指针:

void operation(student*& the_arr [...]

我建议您避免使用以下解决方案,而是返回新指针:

student* operation(student* the_arr, int number_of_students) {
    delete[] the_arr;
    the_arr = new student[3];
    [...] 
    return the_arr; // <----
}

分配abc = new student[0];没有任何意义。您正在尝试分配 0 个元素的数组。也许你的意思是abc = new student[1];

于 2013-03-22T16:38:26.723 回答
0

您应该只使用向量或其他序列对象。虽然我不确定你想用你的代码做什么。这是一个简单的例子:

// Vector represent a sequence which can change in size
vector<Student*> students;

// Create your student, I just filled in a bunch of crap for the
// sake of creating an example
Student * newStudent = new Student;
newStudent->a = 1;
newStudent->b = 2;
newStudent->name = "Guy McWhoever";
newStudent->status = 'A';

// and I pushed the student onto the vector
students.push_back( newStudent );
students.push_back( newStudent );
students.push_back( newStudent );
students.push_back( newStudent );
于 2013-03-22T16:41:48.247 回答