c - C中的结构和结构数组

标签 c

我试图了解结构如何工作。我创建一个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/

相关文章:

c++ - 将字符数组传递给 CUDA 内核

c - qemu 中的启动参数

c - While循环不断重复,程序停止时调试错误

c - 使用派生类型进行 MPI 收集后的垃圾输出

c++ - 这个函数定义是如何工作的?

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

php - similar_text 是如何工作的?

c - 使用两个数组作为素数

c++ - 将路径传递给 CreateProcessA

c - 执行 ls | c 程序中的 wc linux 命令使用 2 个进程通过管道进行通信