int x=(int)malloc(sizeof(float));
或
int y=(int)calloc(1,sizeof(double));
所以简而言之,如果我使用malloc()
或calloc()
请求更大的内存块,但将其分配给较小内存的变量,那么额外的内存会发生什么?
首先,malloc()
和family返回一个指向void
(void *
)的指针,我们将其存储到一个"类型"指针中,然后使用该指针将"类型"的值存储到内存位置。
对于malloc()
及其家族的调用,我们以字节为单位传递所需的大小,如果成功,它们返回指向所请求内存区域的指针(以字节为单位)。因此,只要x
、y
和z
的值相同,
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)。
简而言之,剩下的两个字节将是下一个整数,这是没有问题的