#include <stdio.h>
struct student
{
int roll_no;
int mark;
struct student *p;
};
int main()
{
struct student *stu;
stu = malloc(sizeof(struct student));
}
结构类型
malloc()
的实际返回值是多少?如何将其分配给结构变量?现在声明
struct student *stu;
像
stu
这样具有4个字节的内存分配只能说是从1000
开始。对于声明
stu = malloc(sizeof(struct student));
首先分配内存块,我们只说
2000
-2012
。然后,赋值部分指向存储在2000
中的1000
的指针。这就是赋值部分对
malloc()
和结构变量起作用的方式。现在,指针即
stu
保留起始地址2000
。因此,现在stu->roll_no
将访问第一个4个字节,而stu->mark
将访问接下来的4个字节,依此类推。问题是编译器如何理解它,而不是stu->roll_no
等同于*(stu+0)
和stu->mark
等同于*(stu+1)
。对此的解释将不胜感激。 最佳答案
malloc()
返回一个指向内存块(void *
)的指针,该指针的大小足以容纳size
(第一个参数)字节,而不管该参数是什么或将结果强制转换为什么。
例如,stu->roll_no
将访问分配的内存的前四个字节(假定int
是32位)(假定未填充结构)。
在C中,void *
指针被隐式转换为它们所分配的指针类型。
您的理解是正确的,除了以下声明:
为了清楚起见,与普通结构变量不同,后者将为struct学生分配12个字节,而结构指针变量仅分配4个字节。
在这种情况下,指向结构的指针分配在堆栈上,而结构本身分配在堆上。如果直接使用结构,它将在堆栈上分配12个字节,而在堆上则没有字节。
您对此是正确的:
它不是stu->roll_no
等同于*(stu+0)
和stu->mark
等同于*(stu+1)
stu->roll_no
等效于*((int *)stu+0)
,stu->mark
等效于*((int *)stu+1)
。注意强制转换为int *
。
关于c - 结构类型的malloc()的返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56412211/