我试图了解结构如何工作。我创建一个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;
}
最佳答案
如评论中所述,您的问题与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
存储类显式地给出可变的静态存储持续时间: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;
,因为这是此处的默认设置。动态的:分配有
malloc()
,calloc()
或realloc()
的对象具有动态存储持续时间。这意味着它会一直存在,直到您明确free()
为止。分配函数返回一个指向具有动态存储持续时间的对象的指针。这就是您的示例程序所使用的,因此从函数返回此指针是可以的。该对象将一直存在,只要不再需要,就必须调用free()
。有了这些信息,您应该了解代码的作用。我忽略了线程存储的持续时间以及有关链接的任何内容,因为它与您的问题没有直接关系,您以后可以了解这些内容。
您的
struct
只是定义了一个结构化的数据类型,该类型是由多个成员对象组成的类型。上面的规则并没有改变。在您的示例中,整个struct
(包括另一个struct
的数组)是一个具有动态存储持续时间的已分配对象。回到第一段,典型的C实现将具有静态存储持续时间的对象放置在bss段中(在程序启动时分配),将具有自动存储持续时间的对象放置在堆栈上(随每个函数调用动态增长)和具有动态存储的对象堆中的持续时间。但这只是典型的实现,C甚至可以在不提供这些概念的平台上工作。
关于c - C中的结构和结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45852670/