如果我使用malloc和calloc作为float变量并将其分配给int那么2个字节的其余部分会发生什么?

时间:2016-09-25 15:12:57

标签: c++ c malloc calloc

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

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

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

2 个答案:

答案 0 :(得分:3)

首先,malloc()和系列会返回指向voidvoid *)的指针,我们将其存储到“指向类型指针”然后使用该指针将“type”的值存储到内存位置。

对于对malloc()和family的调用,我们以字节为单位传递所需的大小,如果成功,它们返回指向所请求的内存区域的指针(以字节为单位)。因此,只要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个。那里没有技术问题。

答案 1 :(得分:0)

回答两个字节的剩余部分

如果我们有以下代码行

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

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

我们可以将其作为

访问
  

x [0]与*(x + 0)和x [1]相同,与*(x + 1)相同。

总之,两个字节的剩余部分将是下一个整数,并且没有问题。