我是C ++编程的新手。所以我只是想知道结构的内存分配是静态的还是动态的?这是我基本上拥有的代码。
struct student {
double average;
struct subjects sub[course_numbers];
};
struct subjects {
char name;
int crn;
int credits;
};
答案 0 :(得分: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;
}
答案 1 :(得分:0)
存储区域多于堆栈或堆,还有自动存储和常量存储。您的实例所在的内存取决于您定义实例的方式和位置。
在函数外部声明实例会将实例置于自动存储中。这是声明全局变量和文件全局变量的地方:
My_Struct instance;
// or:
static My_Struct instance;
在函数内声明变量为非静态变量,可以将实例放在堆栈上(假设实现使用了一个):
void Any_Function()
{
My_Struct instance;
}
同样,允许编译器使用引用或其他方式(处理器缓存)来表示结构,因此您的实例可能不在堆栈中。
使用new
分配将实例放入动态内存(a.k.a. heap):
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;
}
所以,回答你的问题:根据声明实例的方式和位置,将结构放入内存中。内存区域多于static
或dynamic
。 static
有多种定义,因此您必须澄清。通常,dynamic
表示在运行时。 static 实例可以引用在编译/构建过程中分配的实例。