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