我试图了解结构是如何工作的。我创建了Student * ptr
并在function()
的数组中设置了值。
因为我使用指针,这些更改是否会持续存在?如果我创建一个新功能,并检查if (s->info[0].age == 10)
,它仍然是10,对吗?
#define MAX_SIZE 10
static Student * ptr = NULL;
typedef struct {
uint32 age;
uint32 gradeLevel;
} Info;
typedef struct {
Info info[MAX_SIZE]; // this array is created on the stack right?
// so I do not need to allocate memory
} Student;
void function()
{
Student * s = malloc(sizeof(Student));
ptr = s;
s->info[0].age = 10;
}
答案 0 :(得分:0)
正如评论中所述,您的问题与struct
没有任何关系。此外,暂时忘记堆栈和堆 - C不知道这些概念,许多只是使用 C 的实现
您需要了解/了解的是范围,存储持续时间以及C中对象的链接:
范围:标识符的范围定义了可以访问此标识符以引用其所代表的对象的区域。当标识符在任何大括号外声明时,它始终是由最近的大括号({ }
)或整个源文件包围的区域(称为文件范围 >)。例如:
int a; // a has file scope
int main(void)
{
int b; // the scope of this variable is the main function
if (1)
{
int c; // this variable can only be referred to inside the if block
c = 1; // valid
}
b = c; // INVALID, c is not "in scope" here
}
存储持续时间:对象的存储持续时间决定了对象的生存时长。您应该了解以下存储持续时间:
static: 静态存储持续时间的对象在程序的整个执行时间内都存在。 文件范围中声明的变量默认情况下静态存储持续时间 。您可以使用static
存储类显式提供变量静态存储持续时间:
int a; // static storage duration by default
int func(void)
{
static int b; // explicit static storage duration.
// If you enter this function multiple times, you will get the SAME variable
}
自动 自动存储持续时间的对象与其范围内部的执行完全相同(或者在从这个范围调用的函数)。对于文件范围中的所有变量不,这是默认。因此,以下代码错误:
int *func(void)
{
int a = 5; // automatic storage duration
return &a; // ERROR
}
一旦此函数退出,a
不再存在,因为执行离开了范围。因此,此函数返回的指针不指向有效对象。
此存储持续时间auto
有存储类说明符,但由于您无法将自动存储持续时间提供给文件作用域无论如何变量(这将毫无意义),这个关键字可以说是无用的。在函数中,您可以编写与auto int a;
完全相同的int a;
,因为它是此处的默认值。
动态:<{1>},malloc()
或calloc()
的已分配的对象具有动态存储持续时间。这意味着它明确地直到你明确realloc()
它。分配函数为动态存储持续时间的对象返回指针。这是您的示例程序使用的,因此从函数返回此指针是正常的。只要您愿意,该对象就会存在,一旦您不再需要它,您必须致电free()
。
有了这些信息,您应该了解代码的作用。我遗漏了线程存储持续时间以及有关链接的任何内容,因为它与您的问题没有直接关系,您可以稍后了解这些内容。
您的free()
只定义结构化数据类型,这是一种由多个成员对象组成的类型。它不会改变上述规则。在您的示例中,您的整个struct
(包括另一个struct
的数组)是一个分配的对象,动态存储持续时间。
回到第一段,典型的C 实现会将静态存储持续时间的对象放在 bss段中(在程序中分配)启动),堆栈上自动存储持续时间的对象(每个函数调用动态增长)和动态存储持续时间的对象>堆。但这只是典型的实现,C也适用于甚至不提供这些概念的平台。