代码之家  ›  专栏  ›  技术社区  ›  Anka Hanım

关于结构和动态数组地址的问题

  •  0
  • Anka Hanım  · 技术社区  · 4 月前

    我在堆区域中动态创建了一个数组,其数据类型为我之前定义的结构体。我用指针管理这个动态数组。数组中的元素数量由 n 用户输入的值。

    现在,指针保存数组第一个元素的地址。那么,数组第一个元素的地址是否与结构体的地址相同?结构在内存中的行为像块吗?

    我想问的是,什么时候 n=4 如果数组的第一个元素取结构的地址,那么我在下面共享的指针变量是否保存了该元素的地址,并通过访问该内存区域,用用户写入结构变量的值填充它?换句话说,它们是否链接到结构体的地址?

    struct Student
    {
        int studentNumber;
        string studentName;
        double studentMark;
    };
    
    int n;
    cout << "How many elements will the array have?";
    cin >> n;
    cin.ignore();
    
    Student* st = new Student[n];
    
    for (int i = 0; i < n; i++) {
        
        cout << i + 1 << ". students number:";
        cin >> st[i].studentNumber;
        cin.ignore();
    
        cout << i + 1 << ". students name:";
        getline(cin, st[i].studentName);
    
        cout << i + 1 << ". students mark:";
        cin >> st[i].studentMark;
    
        cout << &st[i] << endl;
        cout << &(st[i].studentNumber) << endl;
    }
    
    delete[] st;
    
    1 回复  |  直到 4 月前
        1
  •  0
  •   Chris    4 月前

    内存布局

    是的,数组中的元素在内存中是连续的,是的, st 在你的代码中有一个指向第一个的指针 Student 动态分配数组中的结构。

    除非结构是const,否则可以使用 std::cin 将信息读入该数组元素的各个字段。

    std::string

    请注意,char数组数据包含在 std::string 并且因此不是阵列存储器的连续部分。

    std::vector

    正如评论中所指出的,最佳做法是使用 std::vector 表示在编译时大小未知的数组,因为这会为您处理内存分配和取消分配。你可能也想 avoid using namespace std; 并使用a range-based for-loop .

    大致如下。

    #include <iostream>
    #include <string>
    #include <vector>
    
    struct Student
    {
        int studentNumber;
        std::string studentName;
        double studentMark;
    };
    
    int main() {
        int n;
        std::cout << "How many elements will the array have?";
        std::cin >> n;
        std::cin.ignore();
    
        std::vector<Student> st(n);
    
        for (auto &student : st) {
            std::cout << i + 1 << ". students number:";
            std::cin >> student.studentNumber;
            std::cin.ignore();
    
            std::cout << i + 1 << ". students name:";
            std::getline(cin, student.studentName);
    
            std::cout << i + 1 << ". students mark:";
            std::cin >> student.studentMark;
    
            std::cout << &student << std::endl;
            std::cout << &(student.studentNumber) << std::endl;
        }
    }