#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/

10-12 20:42