如果有如下结构:
struct student {
int id;
int marks;
} *S1,S2;
为什么需要为* S1而不是S2分配内存?当* S1被声明为结构指针时,是否没有分配给它的内存?仅在我们明确分配时才分配内存吗?
答案 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中)。因此适用于S1
和S2
。但是S1
是一个指针,因此需要存储指向结构的指针,S2
是一个结构,因此分配了一个完整结构的存储空间。区别在于S1
是间接的,意味着它的存储不包含结构而是结构的地址,如果您希望它链接到您需要为其提供适当地址的结构。之一:
S1 = &S2;
其中&
是取S2
地址的运算符。现在S1
是指向S2
的链接。或者:
S1 = malloc(sizeof(struct student));
其中malloc
(动态)为结构分配存储并返回其地址(如果成功)。