结构指针的内存分配

时间:2016-08-26 17:17:40

标签: c pointers

如果有如下结构:

struct student {
    int id;
    int marks;
} *S1,S2;

为什么需要为* S1而不是S2分配内存?当* S1被声明为结构指针时,是否没有分配给它的内存?仅在我们明确分配时才分配内存吗?

3 个答案:

答案 0 :(得分:3)

在C中,每个变量都是一个内存位置。在您的示例中,S1和S2都是变量,但是,S1恰好是指针。指针是一个变量,其目的是定义为保存存储器位置的地址。

在您的示例中,S2是struct student类型的普通变量,指向大小为sizeof(struct student)的内存位置。 S1是一个指针变量,指向一个内存位置,其大小等于指针变量的大小(32位系统为4个字节,64位系统为8个字节)。

正如您需要为正常变量赋值一样,您需要将内存位置的地址分配给指针,这是您在分配内存并分配给它时所执行的操作。

答案 1 :(得分:1)

嗯,这就是语言的运作方式。它会自动为您要求的类型保留内存。如果您要求struct student,则会为struct student保留内存。如果您要求pointer,则会为pointer保留内存。

int的示例:

int n;  // Reserves memory for an int
int *p; // Reserves memory for a pointer (that points to an int)
        // but there is no memory allocated to hold the int
        // p needs to be initialized before you dereference it (i.e. *p)

p = malloc(sizeof(int));  // Initialize p and allocate memory to hold the int
if (!p) exit(1);          // Error - no memory available

*p = 5; // Now p can be used

free(p); // Release the memory

您的情况与上述示例没有什么不同。 S2是struct student,而S1是指针(到struct student),你需要通过为struct student分配内存来初始化S1。像:

S1 = malloc(sizeof(struct student));

答案 2 :(得分:0)

每个变量都与某个存储相关联(至少在C中)。因此适用于S1S2。但是S1是一个指针,因此需要存储指向结构的指针,S2是一个结构,因此分配了一个完整结构的存储空间。区别在于S1是间接的,意味着它的存储不包含结构而是结构的地址,如果您希望它链接到您需要为其提供适当地址的结构。之一:

S1 = &S2;

其中&是取S2地址的运算符。现在S1是指向S2的链接。或者:

S1 = malloc(sizeof(struct student));

其中malloc(动态)为结构分配存储并返回其地址(如果成功)。