如果我对浮点变量使用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?
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)。
简而言之,剩下的两个字节将是下一个整数,这是没有问题的
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 在 Linux 中,uint32_t从 4 个字节更改为 6 个字节
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 向指针地址添加 20 个字节偏移量
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- C++/地址空间:每个地址 2 个字节?
- 为什么这个结构需要 24 个字节
- 为什么带有 vptr 的对象长 12 个字节?
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 在编译时而不是运行时创建一个由两个字节组成的值
- 为什么在我的实现中,所有数组都对齐到 16 个字节?
- 使用 Python 导出 4 个字节浮点数
- C++向指针地址添加 4 个字节
- 是否强制转换void**并将第一个字节设置为nullptr
- AES-128 CFB-8解密的前16个字节已损坏
- Qt TCP 套接字 - 写入超过 15 个字节
- 在"C++代码"部分中,可能会写入两个字节
- 视觉C++转换和写入值为 10 的无符号 int 给出 5 个字节