如何在 C++ 中对结构内的结构进行动态赋值?

How can I do dynamic assignment to a struct inside a struct in C++?

目前我正在使用 C++ 对结构内的结构进行动态分配。所以,我做了一个我认为可以动态分配的代码。 这是我制作的代码:

#include<iostream>
using namespace std;
int cnt = 0;
struct num{
    int x;
    int y;
};
struct name {
    char Stu[30] = { 0 };
    num *number;
};

int input(int& a) {
    if (cnt == 0) {
        cout << "입력할 수 : ";
        cin >> a;
        cnt++;
        return a;
    }
    if (cnt == 1) {
        cout << "입력할 수 : ";
        cin >> a;
        cnt++;
    }
}

void input(char *pt) {
    if (cnt == 2) {
        cout << "입력할 글자 : ";
        cin >> pt;
        cnt++;
    }
}

int inputnum(int i) {
    cout << "할당할 숫자를 쓰시오 : ";
    cin >> i;
    return i;
}

void printdata(name *pSt, int i, int j) {
    cout << pSt[i].number[j].x << endl;
    cout << pSt[i].number[j].y << endl;
    cout << pSt[i].Stu << endl;
}

int main() {
    int num1 = 0;
    int num2 = 0;
    num1 = inputnum(num1);
    num2 = inputnum(num2);
    name* student = new name[num1];
    for (int i = 0; i < num1; i++) {
        for (int j = 0; j < num2; j++) {
            student[i].number = new num[num2];
            input(student[i].number[j].x);
            input(student[i].number[j].y);
            input(student[i].Stu);
            cnt = 0;
        }
    }

    for (int i = 0; i < num1; i++) {
        for (int j = 0; j < num2; j++) {
            printdata(student, i, j);
        }
    }

}

但是如果我在 num2 中输入超过 2 个,输出数字会很奇怪,比如 -842150451。 如何在 C++ 中对结构内的结构进行动态赋值?

您的代码有几个问题。

首先,使用std::string代替char[30]。其次,除非必要,否则不要分配内存。不需要num* number。使用 std::vector.

你可以把你的代码如下:

struct num {
    int x;
    int y;
};
struct name {
    std::string      Stu;
    std::vector<num> number;
};

-842150451 不是一个奇怪的数字。它是 0xCDCDCDCD 的十进制。这是 Microsoft 调试 CRT 用来表示未初始化堆内存的值。参见 here

关于input个函数,你为什么不写一些更简单的函数呢?

void input_x(int& x)
{
    cout << "입력할 수 : ";
    cin >> x;
}

void input_y(int& y)
{
    cout << "입력할 수 : ";
    cin >> y;
}

void input_s(char *pt)
{
    cout << "입력할 글자 : ";
    cin >> pt;
}

您可以按如下方式使用:

    for (int i = 0; i < num1; i++) {
        for (int j = 0; j < num2; j++) {
            student[i].number = new num[num2];
            input_x(student[i].number[j].x);
            input_y(student[i].number[j].y);
            input_s(student[i].Stu);
        }
    }

input_s 应该使用 std::string,不过,如果您使用我上面建议的方法:

void input_s(std::string& pt)
{
    cout << "입력할 글자 : ";
    cin >> pt;
}

至于 name* student 你可以用 std::vector<name>:

代替
    std::vector<name> student;
    for (int i = 0; i < num1; i++) {
        for (int j = 0; j < num2; j++) {
            name s;
            s.number.resize(num2);
            input(s.number[j].x);
            input(s.number[j].y);
            input(s.Stu);
            student.push_back(s);
        }
    }