关于嵌套结构

about Nested Structures C++

本文关键字:结构 嵌套 于嵌套      更新时间:2023-10-16

我想学习c++,这是我的初学者问题。

#include <iostream>
#include <string>
using std::cout;
using std::endl;
struct student{
    struct address{
        int no;
        std::string city;    //problem is here
    };
    char grade;
    int num;
    address *addr;
};
int main(){
    student st1;
    student *pSt1 = &st1;
    pSt1->grade = 'A';
    pSt1->num = 1234;
    pSt1->addr->no = 123;
    pSt1->addr->city = "Imladris";
    return 0;
}

它崩溃了,但是如果我这样改变std::string city:

struct student{
    struct address{
        std::string city;   // here
        int no;
    };
    char grade;
    int num;
    address *addr;
};

它不会崩溃并返回0…在这两种情况下都没有错误或警告。也许,这里没有必要使用指针,但正如我所说,我正在学习c++。这是一个关于指针/结构体的示例代码。

我知道如何修复它,但我想知道为什么它坏了。我改变了字符串city的声明顺序,它没有崩溃。为什么?

您刚刚遇到了未定义行为这个术语。代码的最终结果依赖于编译器和平台。对未指定值的指针解引用(如这里提到的)被认为是无法预测操作结果的情况之一。

保留嵌套结构,但将其添加到成员变量声明中:

address *addr = new address();

或者一个更好的方法是使用它作为用户@tobi303提到:不要声明它为一个指针,只是address的一个实例代替:

address addr;

但是这样使用:

pSt1->addr.no = 123; // set
pSt1->addr.city = "Imladris"; // set