-6

我对 C++ 编程很陌生。所以我只想知道结构的内存分配是静态的还是动态的?这是我基本上拥有的代码。

struct student {
    double average;
    struct subjects sub[course_numbers];
};

struct subjects {
    char name;
   int crn;
   int credits;
};
4

2 回答 2

0

内存区域比堆栈多,还有自动存储和常量存储。您的实例所在的内存取决于您定义实例的方式和位置。

在函数外部声明实例会将实例置于自动存储中。这是声明全局和文件全局变量的地方:

My_Struct instance;
// or:
static My_Struct instance;

在函数内将变量声明为非静态,可以将实例放在堆栈上(假设实现使用一个):

void Any_Function()
{
  My_Struct instance;
}

同样,允许编译器使用引用或其他方式(处理器缓存)来表示结构,因此您的实例可能不在堆栈中。

分配 usingnew将实例放入动态内存(又名堆):

void Another_Function()
{
  My_Struct * p_instance = new My_Struct;
  // ...
  delete p_instance;
}

您还可以将实例放入常量内存或放置所有常量文字的内存中:

const My_Struct instance = {/*...*/};

您还可以通过将实例声明为static函数内部来将实例放入“全局”内存中:

void Yet_Another_Function()
{
  static My_Struct instance;
}

因此,回答您的问题:根据声明实例的方式和位置,将结构放入内存中。内存区域多于staticdynamic。有多种定义static,所以你必须澄清一下。通常,dynamic意味着在运行时。静态实例可以指在编译/构建过程中分配的实例

于 2018-03-14T16:55:03.480 回答
0

您发布的代码只是数据对象“学生”和“主题”的定义。它只是代码,既不存在于堆栈也不存在于堆中,直到您将其投入使用并从中生成实际类型。这是一个用它做某事的代码示例:

//define the struct
struct myStruct
{
    int myInt;
};

// use it
int main(void)
{
    myStruct oStruct{456}; //put on stack, automatically cleaned up at end of main function.
    myStruct* pStruct = new myStruct{654}; //put on heap, must be cleaned up manually.

    delete pStruct; //because you put on heap, clean it up afterwards.
    pStruct = nullptr;

    return 0;
}
于 2018-03-14T10:29:10.717 回答