如果我对浮点变量使用malloc和calloc,并将其赋值为int,那么剩下的2个字节会发生什么呢?

If I am using malloc and calloc for a float variable and assign it to int then what will happen to the rest of the 2 bytes?

本文关键字:2个 字节 什么 int 浮点变量 malloc 赋值 calloc 如果      更新时间:2023-10-16
int x=(int)malloc(sizeof(float));

int y=(int)calloc(1,sizeof(double));

所以简而言之,如果我使用malloc()calloc()请求更大的内存块,但将其分配给较小内存的变量,那么额外的内存会发生什么?

首先,malloc()和family返回一个指向void (void *)的指针,我们将其存储到一个"类型"指针中,然后使用该指针将"类型"的值存储到内存位置。

对于malloc()及其家族的调用,我们以字节为单位传递所需的大小,如果成功,它们返回指向所请求内存区域的指针(以字节为单位)。因此,只要xyz的值相同,

  int * p = malloc(x);

  int * p = malloc(y);

  int * p = malloc(z);

将返回相同的内存量。

现在,如果它发生了,在您的平台sizeof(int) == sizeof(float) == 4上,那么,我们可以写

  int * p = malloc(sizeof(int));

  int * q = malloc(sizeof(float));

  int * r = malloc(4);

,它们都将返回相同的内存量

注意:以上语句只是为了说明,使用malloc()的最佳方式是使用

形式
  <someType> * var = malloc(sizeof(*var));

FWIW, (就像你在代码中所做的那样)将指针分配给整数类型是实现定义的行为。一般情况下,不要这样做。

也就是说,你总是可以自由地分配比你需要的更多的内存,从C的角度来看没有问题,只要你free()。例如,您可以为10个整数分配空间,但最终只使用其中的5个。这没有技术问题。

其余两个字节的答案

如果我们有以下代码行

int *x=(int*)malloc(sizeof(float));

malloc返回一个指针,然后将其类型转换为整型指针。
假设float的大小为4字节,int的大小为2字节。现在传递给malloc的参数只是您想要分配的字节数。这里sizeof(float)返回4,分配了4个字节,malloc返回一个指向分配的第一个字节的指针。所以在这种情况下,有两个整数空间被分配这是连续分配。所以前两个字节是第一个整型,后两个字节是下一个整型,它变成了一个数组。

可以通过

访问

x[0]等于*(x+0), x[1]等于*(x+1)。

简而言之,剩下的两个字节将是下一个整数,这是没有问题的